方法一:用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對象必須定義在主線程中,如果是多個類直接互相調(diào)用涯捻,就不是很方便浅妆,需要傳遞content對象或通過接口調(diào)用;?
方法二:用Activity對象的runOnUiThread方法更新?
在子線程中通過runOnUiThread()方法更新UI:?
newThread() {
publicvoidrun(){
//這兒是耗時操作障癌,完成之后更新UI凌外;
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
//更新UI
imageView.setImageBitmap(bitmap);
}
});
}
}.start();
如果在非上下文類中(Activity),可以通過傳遞上下文實現(xiàn)調(diào)用涛浙;?
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 );//得到來自網(wǎng)絡(luò)的信息刷新頁面?
? }?
}
總結(jié):UI的更新必須在主線程中完成我注,所以不管上述那種方法按咒,都是將更新UI的消息發(fā)送到了主線程的消息對象,讓主線程做處理但骨;