2016-11-13 56 views
0

我有一個TextView佈局,說mainTextView從Android中的線程更新視圖

我的活動文件看起來像:

public class SecondActivity extends AppCompatActivity { 

    private static Integer i = 0; 
    private TextView tv = null; 


    @override 
    public void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_layout); 

     tv = (TextView) findViewById(R.id.mainTextView); 

     new MyThread().execute(); 
    } 


    private void notifyAChange() { 
     tv.setText(i.toString()); 
    } 



    private class MyThread extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground (String... params) { 

      while (true) { 

       try { 
        i++; 
        Thread.sleep(1000); 
        notifyAChange(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

這會返回一個致命異常上運行。我知道我不能觸摸另一個線程的視圖,除了原始視圖之外,但在這種情況下,我正在觸摸主線程的視圖,所以出了什麼問題?

+0

請始終提供完整的異常和堆棧跟蹤有關的詳細信息! –

回答

1

不,你在AsyncTask(工作線程)的doInBackground部分。
您正在調用notifyAChange()表單工作線程,而不是主UI線程。
您應該從onPostExecute更新UI。或者,您也可以使用runOnUiThread來更新視圖。

0

asyncktask主要用於執行長時間運行的任務,所以有三種方法preExecute設置進度條開始執行任務,doinbackground執行任務如下載數據(主線程),後執行任務完成後執行任務 您只能在使用asynctask時從Post execute更改UI組件。 要使asynktask參考https://developer.android.com/reference/android/os/AsyncTask.html 以及實施和說明,請參閱AsynkTask ImplementationUpdate UI from Thread 你也可以使用RunonUI therad方法和處理程序