无法使用线程在TextView中显示消息

时间:2013-10-29 19:30:17

标签: android multithreading tcp textview

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

有错误:

java.lang.NullPointerException
FATAL EXCEPTION: Thread-10

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

类ReadMes扩展了线程{

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();
            }
        }
    }
}

}

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

尝试使用

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

而不是

tv.setText(message);

答案 2 :(得分: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(Runnable)
  2. View.post(可运行)
  3. View.postDelayed(Runnable,long)
  4. 因此请使用它,即将此行tv.setText(message);放在runOnUiThread

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

    或者

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

    希望这对你有所帮助。