2013-10-29 43 views
0

這是一款Android應用程序,該應用程序想要與其他Android設備連接。 我想在我從服務器收到的TextView上顯示消息。 但在這一行有有錯誤,tv.setText(message);使用線程無法在TextView中顯示消息

有錯誤:

java.lang.NullPointerException 
FATAL EXCEPTION: Thread-10 

請幫我顯示TextView的消息,謝謝。

類自述文件擴展Thread {

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

}

回答

0

嘗試使用

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

代替

tv.setText(message); 
0

您不能修改從後臺線程任何屏幕上。

您需要使用處理程序從後臺線程與UI線程進行通信,並讓處理程序爲您更改TextView,或者您可以使用AsyncTask將線程/處理程序交互抽象爲一個「更易於使用「包。

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提供了severa l從其他線程訪問UI線程的方式。下面是一個方法列表,可以幫助:

  1. Activity.runOnUiThread(Runnable接口)
  2. View.post(Runnable接口)
  3. View.postDelayed(Runnable接口,長)

所以用它就好,就是把這條線tv.setText(message);裏面的runOnUiThread

runOnUiThread(new Runnable() { 

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

或者

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

希望這有助於你。