小弟今天自己的手机做了个socket的demo程序,但是一按下按键就强制退出,不知道怎么回事,socket已经放到新线程里去了啊,求帮助啊。程序如下package com.example.final_test;import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;import org.xml.sax.Attributes;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.sax.StartElementListener;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;@SuppressLint("NewApi")
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public class MainActivity extends Activity { // @TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi")
// @Override
private Button starButton1;
private Button starButton2;
private Button endButton1;
private Button endButton2;
private TextView textView;
private Socket clientsocket = null; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView1);
starButton1 = (Button) findViewById(R.id.button1);
starButton2 = (Button) findViewById(R.id.button3);
endButton1 = (Button) findViewById(R.id.button2);
endButton2 = (Button) findViewById(R.id.button4);
starButton1.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new MyThread()).start();
}
});
} public class MyThread implements Runnable { @Override
public void run() {
// TODO Auto-generated method stub
textView.setText("123");
try {
clientsocket = new Socket("172.18.58.30", 54321);
PrintWriter out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
clientsocket.getOutputStream())), true);
out.println("1");
out.close();
clientsocket.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}}异常打印也比较奇怪:
求大神来解决下

解决方案 »

  1.   

    textView.setText("123");
    这个不能放到线程里面,放到UI线程里面才能执行。
      

  2.   

    自己开的子线程中不能直接进行UI操作,只能在主线程中进行。要在子线程中操作UI比较简便的方法是使用handler,第58行可以改为:
    handler.post(new Runnable(){
       @Override
       public void run() {
        textView.setText("123");
       }});
    handler对象引用可以在onCreate方法中获得。