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对象,造成不必要的垃圾回收。开发者一定要避免这样的情况。