解决方案 »

  1.   

    myTextView.setText(msg)
    非UI线程不能更新UI,通过handle更新吧。
      

  2.   


    怎么通过handle更新小白一个
      

  3.   


    public void run() {
                    try {
                        sk = new Socket("127.0.0.1", 12345); // 创建客户端数据输入,输出流,用于对服务器发送或接收数据
                        InputStream is = sk.getInputStream();
                        byte[] b = new byte[1024];
                        int leng = is.read(b);
                        String msg = new String(b);
                        //myTextView.setText(msg);
                        handler.hasMessages(1, msg);//新增
                        String ss = new String(b, 0, leng, "UTF-8");
                        System.out.println(ss);
                        is.close();
                        sk.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }下面再增加一个Handler handler=new Handler(new Handler.Callback()
    {

    @Override
    public boolean handleMessage(Message msg)
    {
    switch (msg.what)
    {
    case 1:
    myTextView.setText(msg.obj);
    break; default:
    break;
    }
    return false;
    }
    });
      

  4.   

    我加了之后,客户端:package com.example.testandroid2;import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;import android.widget.EditText;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Button;
    import android.widget.Toast;
    import android.view.View.OnClickListener;import android.os.Handler;
    import android.os.Message;public class MainActivity extends Activity {
    private TextView myTextView;
    private EditText myEditText;
    private Button btnProduct = null;
    // private OutputStream oi;
    DataOutputStream out;
    private String edit;
    private Socket sk;
    boolean flag = false;
    Thread thread;
    Button.OnClickListener button_listener = null; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myTextView = (TextView) findViewById(R.id.textView1);
    myEditText = (EditText) findViewById(R.id.edittext);
    btnProduct = (Button) findViewById(R.id.button1);
    btnProduct.setOnClickListener(listener);

    Thread t = new Thread(new Runnable() {
    public void run() {
    try {
    sk = new Socket("192.168.1.104", 12345); // 创建客户端数据输入,输出流,用于对服务器发送或接收数据
    InputStream is = sk.getInputStream();
    byte[] b = new byte[1024];
    int leng = is.read(b);
    String msg = new String(b);
    // myTextView.setText(msg);
    handler.hasMessages(1, msg);//新增
    String ss = new String(b, 0, leng, "UTF-8");
    System.out.println(ss);
    is.close();
    sk.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    Handler handler=new Handler(new Handler.Callback()
        {
             
            @Override
            public boolean handleMessage(Message msg)
            {
                switch (msg.what)
                {
                case 1:
                    myTextView.setText((CharSequence)msg.obj);
                    break;
     
                default:
                    break;
                }
                return false;
            }
        });

    });
    t.start();
    } private OnClickListener listener = new OnClickListener() { public void onClick(View v) { (new Thread() {// 这里有一个新线程,网络操作放到这里线程里
    public void run() {
    super.run(); try { // sk = new Socket("192.168.253.1", 12345);
    // 创建客户端数据输入,输出流,用于对服务器发送或接收数据
    edit = myEditText.getText().toString();// 得到EditText里面的内容
    out = new DataOutputStream(sk.getOutputStream());
    out.writeUTF(edit); } catch (IOException e1) {
    System.out.println("无法连接");
    } }
    }).start();
    } };
    }
    运行后点击发送,还是一样的结果:怎么办啊,楼上大神
      

  5.   


    1、添加网络链接权限
    2、myTextView.setText((CharSequence)msg.obj);//myTextView.setText((String)msg.obj);
    再你贴一下你logcat红颜色显示的部分,
    window->show view->other->logcat  (不要是logcat(deprecated))
      

  6.   

    刚才写错了//    myTextView.setText(msg);
    Message myMsg = handler.obtainMessage(1,msg);
    handler.sendMessage(myMsg);
      

  7.   

    哎,还有在线程里面的
    edit = myEditText.getText().toString();// 得到EditText里面的内容,这个不能放在run里面
      

  8.   

    刚才写错了//    myTextView.setText(msg);
    Message myMsg = handler.obtainMessage(1,msg);
    handler.sendMessage(myMsg);
    我照着又改了一下,还是一样的问题。
    要不要我把程序传给你看一看吧.........
      

  9.   

    仔细一看。。你把handler放错地方了
    放到和OnClickListener类似的
    handler是内部类啊。。
      

  10.   

    仔细一看。。你把handler放错地方了
    放到和OnClickListener类似的
    handler是内部类啊。。
    public class MainActivity extends Activity {
    private TextView myTextView;
    private EditText myEditText;
    private Button btnProduct = null;
    // private OutputStream oi;
    DataOutputStream out;
    private String edit;
    private Socket sk;
    boolean flag = false;
    Thread thread;
    Button.OnClickListener button_listener = null; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myTextView = (TextView) findViewById(R.id.textView1);
    myEditText = (EditText) findViewById(R.id.edittext);
    btnProduct = (Button) findViewById(R.id.button1);
    btnProduct.setOnClickListener(listener);

    Thread t = new Thread(new Runnable() {
    public void run() {
    try {
    sk = new Socket("192.168.1.104", 12345); // 创建客户端数据输入,输出流,用于对服务器发送或接收数据
    InputStream is = sk.getInputStream();
    byte[] b = new byte[1024];
    int leng = is.read(b);
    String msg = new String(b);
    // myTextView.setText(msg);
    Message myMsg = handler.obtainMessage(1,msg);
    handler.sendMessage(myMsg);
    String ss = new String(b, 0, leng, "UTF-8");
    System.out.println(ss);
    is.close();
    sk.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    t.start();
    } Handler handler=new Handler(new Handler.Callback()
        {
             
            @Override
            public boolean handleMessage(Message msg)
            {
                switch (msg.what)
                {
                case 1:
                    myTextView.setText((CharSequence)msg.obj);
                    break;
     
                default:
                    break;
                }
                return false;
            }
        });

    private OnClickListener listener = new OnClickListener() { public void onClick(View v) { (new Thread() {// 这里有一个新线程,网络操作放到这里线程里
    public void run() {
    super.run(); try { // sk = new Socket("192.168.253.1", 12345);
    // 创建客户端数据输入,输出流,用于对服务器发送或接收数据
    edit = myEditText.getText().toString();// 得到EditText里面的内容
    out = new DataOutputStream(sk.getOutputStream());
    out.writeUTF(edit); } catch (IOException e1) {
    System.out.println("无法连接");
    } }
    }).start();
    } };
    }
    这样放对吗,可是这样放运行还是出错啊
      

  11.   

    代码更新了,点button按钮不会崩溃,但什么反应都没有package com.example.testandroid22;import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    public class TestAndroid22 extends Activity {
    private TextView myTextView;
    private EditText myEditText;
    private Button btnProduct = null;
    // private OutputStream oi;
    DataOutputStream out;
    private String edit;
    private Socket sk;
    boolean flag = false;
    Thread thread;
    Button.OnClickListener button_listener = null;    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test_android22);
            myTextView = (TextView) findViewById(R.id.textView1);
    myEditText = (EditText) findViewById(R.id.edittext);
    btnProduct = (Button) findViewById(R.id.button1);
    btnProduct.setOnClickListener(listener);
    Thread t = new Thread(new Runnable() {
    public void run() {
    try {
    sk = new Socket("127.0.0.1", 12345); // 创建客户端数据输入,输出流,用于对服务器发送或接收数据
    listener = new OnClickListener() {
    public void onClick(View v) {
    (new Thread() {// 这里有一个新线程,网络操作放到这里线程里
    public void run() {
    super.run();
    try {
    edit = myEditText.getText().toString();// 得到EditText里面的内容
    out = new DataOutputStream(
    sk.getOutputStream());
    out.writeUTF(edit);
    out.flush();
    // out.close();
    } catch (IOException e1) {
    e1.printStackTrace();
    System.out.println("无法连接");
    }
    }
    }).start();
    }
    };
    InputStream is = sk.getInputStream();
    byte[] b = new byte[1024];
    int leng = is.read(b);
    String msg = new String(b);
    myTextView.setText(msg);
    String ss = new String(b, 0, leng, "UTF-8");
    System.out.println(ss);
    is.close();
    // sk.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    t.start();
    } private OnClickListener listener;
    }求大神再看一看
      

  12.   

    没崩溃是你button添加的监听是null吧
    btnProduct.setOnClickListener(listener);//添加了监听
    private OnClickListener listener;//但是监听是空。
    你添加了Null的listener,之后才在thread里创建了listener对象
    第65行你依然myTextView.setText(msg);//在线程里才做ui线程会报错的
    使用handler……百度一下handler的使用就明白怎么用了
      

  13.   

    代码更新了,现在终于可以传数据不蹦了,再次谢谢楼上各位热心回答,感激不尽~
    结贴ing~