0x0 前言
在Android中如何聲明和管理線程呢?至少存在以下幾種方式:
1.使用Thread類;2.使用抽象的AsyncTask類;3.Handler類
0x1 概述
Android應用程序從主線程開始執行,也就是UI線程。如果不啓動啓動另外的線程,Android中所有操作都在UI線程中進行,也就是說在UI線程中進行耗時操作時,會阻塞UI線程,直到操作完成。一般會造成應用程序無響應(ANR,一般5秒五無響應,系統就會退出當前程序),這樣的用戶體驗一定不夠好。有兩個原則一定要遵循:不要阻塞UI線程,不要再UI線程之外的地方更新視圖。
0x3使用Thread類
public class MyThread implements Runnable {
private Activity mActivity;
public MyThread(Activity mActivity) {
this.mActivity = mActivity;
}
@Override
public void run() {
Runnable runnable = new Runnable() {
@Override
public void run() {
((ProgressBar) mActivity.findViewById(R.id.progressBar1))
.setProgress(50);
;
}
};
mActivity.runOnUiThread(runnable);
}
}
我們注意到,當我們更新UI時,我們首先創建了一個新的Runable對象。假如上面的代碼我們做一下修改,如下:
public class MyThread implements Runnable {
private Activity mActivity;
private int mProgress;
public MyThread(Activity mActivity) {
this.mActivity = mActivity;
}
@Override
public void run() {
mProgress = 0;
Runnable runnable = new Runnable() {
@Override
public void run() {
mActivity.findViewById(R.id.progressBar1).setVisibility(
View.VISIBLE);
((ProgressBar) mActivity.findViewById(R.id.progressBar1))
.setProgress(0);
;
}
};
mActivity.runOnUiThread(runnable);
for (int i = 0; i < 100; i++) {
SystemClock.sleep(500);
runnable = new Runnable() {
@Override
public void run() {
// ((ProgressBar) mActivity.findViewById(R.id.progressBar1))
// .setMax(++mProgress);
((ProgressBar) mActivity.findViewById(R.id.progressBar1)).setProgress(++mProgress);
}
};
mActivity.runOnUiThread(runnable);
}
runnable = new Runnable() {
@Override
public void run() {
Toast.makeText(mActivity, "Test Over", Toast.LENGTH_LONG).show();
}
};
mActivity.runOnUiThread(runnable);
}
}
這樣的代碼肯定是不好的,每次更新UI都創建Runable對象,造成不必要的垃圾回收。開發者一定要避免這樣的情況。