0

它是一个 android 应用程序的 prat,这个应用程序想与其他 android 设备连接。我想在从服务器收到的 TextView 上显示消息。但是这一行有错误,tv.setText(message);

有错误:

java.lang.NullPointerException
FATAL EXCEPTION: Thread-10

请帮我在 TextView 中显示消息,谢谢。

类自述文件扩展线程{

private Socket socket;
private TextView tv;

public ReadMes(Socket socket, TextView tv){
    this.socket = socket;
    this.tv = tv;
}

@Override
public void run() {
    BufferedReader reader = null;

    try{
        reader = new BufferedReader( new InputStreamReader(socket .getInputStream()));
        String message = null;
        while( true){
            message = reader.readLine();

            tv.setText(message);
        }
    } catch(IOException e){
        e.printStackTrace();
    } finally{
        if( reader!= null){
            try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

}

4

3 回答 3

0

您不能从后台线程修改屏幕上的任何内容。

您需要使用处理程序从后台线程与 UI 线程进行通信,并让处理程序为您更改 TextView,或者您可以使用 AsyncTask 将线程/处理程序交互抽象为一个“更易于使用”的包。

于 2013-10-29T19:39:12.367 回答
0

尝试使用

runOnUiThread(new Runnable() {
    public void run() {
        tv.setText(message);
    }
}).start();

代替

tv.setText(message);
于 2013-10-29T19:52:46.233 回答
0

当您尝试从工作线程更新 textView 但"do not access the Android UI toolkit from outside the UI thread"

http://developer.android.com/guide/components/processes-and-threads.html

为了解决这个问题,Android 提供了几种从其他线程访问 UI 线程的方法。以下是可以提供帮助的方法列表:

  1. Activity.runOnUiThread(可运行)
  2. View.post(可运行)
  3. View.postDelayed(可运行,长)

所以像这样使用它,即把这条线tv.setText(message);放在runOnUiThread

runOnUiThread(new Runnable() {

            @Override
            public void run() {
            tv.setText(message);    
            }
        });

或者

           tv.post(new Runnable() {
                public void run() {
                    tv.setText(message);    
                }
            });

希望这对您有所帮助。

于 2013-10-29T20:04:05.553 回答