android使用多線程更新ui示例分享
Android線程涉及的技術(shù)有:Handler;Message;MessageQueue;Looper;HandlerThread。
下面看一段在線程中更新UI的代碼:
public class MainActivity extends Activity {
private TextView timeLable;
private Button stopBtn;
private Thread mThread;
private boolean isRunning = true;
private int timeCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeLable = (TextView) findViewById(R.id.timelable);
stopBtn = (Button) findViewById(R.id.stop);
stopBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
isRunning = false;
}
});
mThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
Thread.sleep(1000);
timeCount++;
timeLable.setText("timeCount=" + timeCount + " 秒");
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
mThread.start();
}
}
這段代碼只是在線程中更新TextView的顯示內(nèi)容,但是執(zhí)行后看不到效果,并且報(bào)了一個(gè)錯(cuò):android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
在Android中更新UI處理必須由創(chuàng)建它的線程更新,而不能在其他線程中更新。上面的錯(cuò)誤原因就在于此。
由于timeLable是一個(gè)UI控件,它是在主線程中創(chuàng)建的,但是它卻在子線程中被更新了,更新操作在mThread線程的run()方法中實(shí)現(xiàn)。這樣的處理違背了Android多線程編程規(guī)則,系統(tǒng)會(huì)拋出異常。
要解決這個(gè)問題,就要明確主線程和子線程的職責(zé)。主線程的職責(zé)是創(chuàng)建、顯示和更新UI控件、處理UI事件、啟動(dòng)子線程、停止子線程等;子線程的職責(zé)是計(jì)算時(shí)間和向主線程發(fā)出更新UI消息,而不是直接更新UI。子線程向主線程發(fā)送消息可以用Handler實(shí)現(xiàn)。代碼如下:
public class MainActivity extends Activity {
private TextView timeLable;
private Button stopBtn;
private Thread mThread;
private boolean isRunning = true;
private int timeCount = 0;
final private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 0 :
timeLable.setText("timeCount=" + timeCount + " 秒");
break;
default :
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeLable = (TextView) findViewById(R.id.timelable);
stopBtn = (Button) findViewById(R.id.stop);
stopBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
isRunning = false;
}
});
mThread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
Thread.sleep(1000);
timeCount++;
mHandler.sendEmptyMessage(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
mThread.start();
}
}
運(yùn)行后不會(huì)報(bào)之前的錯(cuò),TextView也能正常更新內(nèi)容了。
- 淺談Android 的線程和線程池的使用
- Android自帶的四種線程池使用總結(jié)
- 在Android線程池里運(yùn)行代碼任務(wù)實(shí)例
- Android 線程之自定義帶消息循環(huán)Looper的實(shí)例
- Android開發(fā)之多線程中實(shí)現(xiàn)利用自定義控件繪制小球并完成小球自動(dòng)下落功能實(shí)例
- Android開發(fā)筆記之:如何安全中止一個(gè)自定義線程Thread的方法
- Android Handler主線程和一般線程通信的應(yīng)用分析
- Android 在其他線程中更新UI線程的解決方法
- android開發(fā)教程之子線程中更新界面
- Android多線程及異步處理問題詳細(xì)探討
- Handler與Android多線程詳解
- Android編程自定義線程池與用法示例
相關(guān)文章
Android實(shí)現(xiàn)Gesture手勢(shì)識(shí)別用法分析
這篇文章主要介紹了Android實(shí)現(xiàn)Gesture手勢(shì)識(shí)別用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android基于Gesture實(shí)現(xiàn)手勢(shì)識(shí)別的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-09-09Flutter List數(shù)組避免插入重復(fù)數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了Flutter List數(shù)組避免插入重復(fù)數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Android中判斷網(wǎng)絡(luò)是否連接實(shí)例詳解
這篇文章主要介紹了Android中判斷網(wǎng)絡(luò)是否連接實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01Android輸入框添加emoje表情圖標(biāo)的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android輸入框添加emoje表情圖標(biāo)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android 使用 ViewPager循環(huán)廣告位的實(shí)現(xiàn)
本文給大家分享android使用 ViewPager循環(huán)廣告位的實(shí)現(xiàn),感興趣的朋友一起學(xué)習(xí)吧2015-11-11Android高級(jí)組件Gallery畫廊視圖使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android高級(jí)組件Gallery畫廊視圖的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12android TextView實(shí)現(xiàn)跑馬燈效果
這篇文章主要為大家詳細(xì)介紹了android TextView實(shí)現(xiàn)跑馬燈效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android 狀態(tài)欄的設(shè)置適配問題詳解
這篇文章主要介紹了Android 狀態(tài)欄的設(shè)置適配問題詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06