2012-10-11 57 views
2

我想更新Android中的循環中的UI,但我得到一個錯誤,說我在錯誤的線程。我不明白爲什麼,因爲我正在使用處理程序。有沒有人有什麼建議?線程問題,當想要從Android中的後臺線程對UI進行循環更新

TextView textView; 
protected Handler handler=new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     textView.setText((String)msg.obj); 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_thread_sleep); 
    textView=(TextView) findViewById(R.id.TextView1); 
    init(); 
} 

public void init() 
{ 
    CounterThread counterThread=new CounterThread(); 
    counterThread.start(); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_thread_sleep, menu); 
    return true; 
} 

class CounterThread extends Thread { 

    @Override 
    public void run() { 
     super.run(); 
     int counter=0; 

     handleString("in Thread handler"); 
     try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());} 

     while(counter<10) 
     { 
      counter++; 
      String counterString=String.valueOf(counter); 
      handleString(counterString); 

      try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());} 
     }//while 
    }//run 

    public void handleString(String string) 
    { 
     Message msg=handler.obtainMessage(); 
     msg.obj="counter"+" "+string; 
     handler.handleMessage(msg); 
    } 

}//thread 

回答

-1

這是因爲您沒有在UI線程上執行代碼。所以,你shoulde使用方法runOnUiThread:http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable

因此,它是這樣的:

protected Handler handler=new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     final String msgString = (String)msg.obj; 
     runOnUiThread(new Runnable() { 
      @Override 
      void run() { 
       textView.setText(msgString); 
      } 
     }); 
    } 
}; 
+0

僅供參考,你已經完全被以這種方式解決它擊敗了使用'Handler'的目的。 「Handler」的意義在於它爲您執行主線程上的代碼,但您必須先適當地調用它才能傳遞消息。 – Devunwired

3

不正確地打電話給Handler。在後臺線程中,調用handler.sendMessage()將消息發佈到隊列中。當它處理它時,這將隨後在Handler上調用handleMessage()方法。請注意,如果您只是使用後臺線程等待一段時間才能再次更新UI,則可以使用sendMessageDelayed()來代替。請參閱使用sendMessageDelayed()Handler能夠完成它自己的計時,而無需創建第二個Thread