Android子線程中更新UI的3種方法

方法一:用Handler?

1、主線程中定義Handler:?

Handler mHandler =newHandler() {

@Override

publicvoidhandleMessage(Message msg){

super.handleMessage(msg);

switch(msg.what) {

case0:

//完成主界面更新,拿到數(shù)據(jù)

String data = (String)msg.obj;

updateWeather();

textView.setText(data);

break;

default:

break;

}

}

};

2、子線程發(fā)消息,通知Handler完成UI更新:?

privatevoidupdateWeather(){

newThread(newRunnable(){

@Override

publicvoidrun(){

//耗時操作,完成之后發(fā)送消息給Handler,完成UI更新;

mHandler.sendEmptyMessage(0);

//需要數(shù)據(jù)傳遞,用下面方法;

Message msg =newMessage();

msg.obj ="數(shù)據(jù)";//可以是基本類型,可以是對象,可以是List、map等;

mHandler.sendMessage(msg);

}

}).start();

}

方法一的Handler對象必須定義在主線程中,如果是多個類直接互相調用,就不是很方便,需要傳遞content對象或通過接口調用;?

方法二:用Activity對象的runOnUiThread方法更新?

在子線程中通過runOnUiThread()方法更新UI:?

newThread() {

publicvoidrun(){

//這兒是耗時操作,完成之后更新UI;

runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

//更新UI

imageView.setImageBitmap(bitmap);

}

});

}

}.start();

如果在非上下文類中(Activity),可以通過傳遞上下文實現(xiàn)調用;?

Activity activity = (Activity) imageView.getContext();

activity.runOnUiThread(newRunnable() {

@Override

publicvoidrun(){

imageView.setImageBitmap(bitmap);

}

});

這種方法使用比較靈活,但如果Thread定義在其他地方,需要傳遞Activity對象;?

方法三:View.post(Runnable r)?

imageView.post(newRunnable(){

@Override

publicvoidrun(){

imageView.setImageBitmap(bitmap);

}

});

這種方法更簡單,但需要傳遞要更新的View過去;?

方法四:AsyncTask

//UI線程中執(zhí)行?

newDownloadImageTask().execute("www.91dota.com");

privateclassDownloadImageTaskextendsAsyncTask{

protectedStringdoInBackground( String... url ){

returnloadDataFormNetwork( url[0] );//后臺耗時操作?

? ? }?

protectedvoidonPostExecute( String result ){

myText.setText( result );//得到來自網絡的信息刷新頁面?

? }?

}

總結:UI的更新必須在主線程中完成,所以不管上述那種方法,都是將更新UI的消息發(fā)送到了主線程的消息對象,讓主線程做處理;

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容