国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)之子線程操作UI的幾種方法

2019-12-12 05:46:24
字體:
供稿:網(wǎng)友

 在Android項(xiàng)目中經(jīng)常有碰到這樣的問題,在子線程中完成耗時(shí)操作之后要更新UI,下面就自己經(jīng)歷的一些項(xiàng)目總結(jié)一下更新的方法:

在看方法之前需要了解一下Android中的消息機(jī)制。

方法1 Activity.runOnUiThread

方法如下:

runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 

這種方法簡單易用,如果當(dāng)前線程是UI線程,那么行動(dòng)是立即執(zhí)行。如果當(dāng)前線程不是UI線程,就發(fā)布到事件隊(duì)列的UI線程。其實(shí)和Handler差不多,都是將這個(gè)更新UI的請求消息,加入到事件隊(duì)列,等待主線程空閑的時(shí)候執(zhí)行。

方法2 Handler

主線程中定義Handler如下:

Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: String data = (String)msg.obj; textView.setText(data); break; default: break; } } }; 

子線程發(fā)消息,通知Handler完成UI更新,代碼如下:

new Thread(new Runnable(){ @Override public void run() { //耗時(shí)操作 mHandler.sendEmptyMessage(0); Message msg =new Message(); msg.obj = "數(shù)據(jù)";//可以是基本類型,可以是對象,可以是List、map等 mHandler.sendMessage(msg); } }).start(); 

方法3 View.post

final Button btn =(Button)findViewById(R.id.btn); btn.post(new Runnable(){ @Override publicvoid run() { btn.setText("Hello"); } }); 

上面的代碼就是更新btn中的內(nèi)容,同樣下面的代碼也可以達(dá)到這種效果。

Handler handler = new Handler(); final Button btn = (Button)findViewById(R.id.btn); handler.post(new Runnable(){ @Override public void run() { btn.setText("Hello"); } }); 

這個(gè)是用handler.post方法,一個(gè)是用View.post方法,handler.post方法已經(jīng)在Android的消息機(jī)制中介紹過了,其實(shí)最終也是調(diào)用了方法2中的send方法。

現(xiàn)在看一下View.post方法的源代碼:

public boolean post(Runnable action) { Handler handler; AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { handler = attachInfo.mHandler; } else { // Assume that post will succeed later ViewRootImpl.getRunQueue().post(action); return true; } return handler.post(action); } 

方法中主要的功能代碼就是attachInfo.mHandler,獲取當(dāng)前線程(即UI線程)的Hanlder,然后將action對象post到Handler里。在Handler里的處理過程上面鏈接文已經(jīng)分析的很清楚了,它將傳遞過來的action對象包裝成一個(gè)Message(Message的callback為action),然后將其投入U(xiǎn)I線程的消息循環(huán)中。在Handler的dispatchMessage方法里,第一句話就是為它所設(shè),直接調(diào)用runnable的run方法。而此時(shí),已經(jīng)路由到UI線程里,因此,我們可以毫無顧慮的來更新UI。

方法4 廣播

子線程中發(fā)送廣播,主線程中接收廣播并更新UI。

方法5 使用AsyncTask

為了簡化子線程中訪問UI,系統(tǒng)提供給了我們AsyncTask。

AsyncTask是一種輕量級的異步任務(wù)類,它可以在線程池中執(zhí)行后臺任務(wù),然后把執(zhí)行進(jìn)度和結(jié)果傳遞給主線程并更新UI。本質(zhì)上來說AsyncTask封裝了Thread和Handler,但是AsyncTask不適合進(jìn)行特別耗時(shí)的后臺任務(wù),如果需要進(jìn)行特別耗時(shí)的任務(wù),建議使用線程池。

不同API版本的AsyncTask具有不同的表現(xiàn),因此需要注意。為了控制篇幅,具體的AsyncTask的使用方法和工作原理,我打算后面單獨(dú)成文進(jìn)行介紹。

以上所述是小編給大家介紹的Android開發(fā)之子線程操作UI的幾種方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時(shí)回復(fù)大家的!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 民和| 四会市| 寻甸| 道真| 平原县| 潮州市| 镇宁| 托克托县| 北票市| 集贤县| 桐柏县| 平度市| 莆田市| 麻江县| 辽源市| 常山县| 双流县| 揭东县| 宜城市| 五家渠市| 武冈市| 康保县| 于都县| 万山特区| 栾川县| 定边县| 北辰区| 望奎县| 永新县| 瓦房店市| 龙江县| 盘锦市| 扎兰屯市| 定襄县| 灵武市| 邵武市| 大埔县| 西林县| 连州市| 建德市| 同江市|