1、注意:
(1)子線程需要切換到UI線程或者主線程去更新線程。
(2)但是子線程單獨也是可以更新UI的,只是谷歌要求我們需要到UI線程去更新。
eg:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread_update_ui);
new Thread(new Runnable() {
@Override
public void run() {
textView.setText("子線程更新ui");
}
});
}
此時我們運行發現,程序沒有任何問題。
eg:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread_update_ui);
new Thread(new Runnable() {
@Override
public void run() {
textView.setText("子線程更新ui");
Thread.sleep(5000);
}
});
}
當我們在里面添加耗時操作的時候,我們會發現程序崩潰。
原因:在oncreat()方法中,此時viewRootlmp還沒有被創建。viewRootlmp在Activity處於onResume之后才被創建的,所以不會執行checkThread方法,自然不會報錯。當進行耗時操作時,此時viewRootlmp已經創建成功,所以程序會崩潰。
(3)Android 采用單線程模式:如果采用多線程去更新UI會導致程序的不可控性,多線程會造成資源競爭。就算采用鎖來控制,那還是相當於采用單線程模式。
二、子線程更新UI的六種方式
(1)
new Thread(new Runnable() {
@Override
public void run() {
Message message=handler.obtainMessage();
message.what=1;
handler.sendMessage(message);
}
}).start();
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==1){
textView.setText("子線程更新ui");
}
}
};
(2)
new Thread(new Runnable() {
@Override
public void run() {
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("子線程更新ui");
}
});
}
}).start();
(3)
new Thread(new Runnable() {
@Override
public void run() {
new Handler().post(new Runnable() {
@Override
public void run() {
textView.setText("子線程更新ui");
}
});
}
}).start();
(4)
new Thread(new Runnable() {
@Override
public void run() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
textView.setText("子線程更新ui");
}
},3000);//延遲時長
}
}).start();
(5)
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("慕九");
}
});
}
}).start();
(6)
new updateAsyncTask().execute();
class updateAsyncTask extends AsyncTask<String,Integer,String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
publishProgress();
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
textView.setText("子線程更新ui");
}
}