当android的一个activity处理某些事情而占用大量的时间时,会导致程序反应慢,让用户感觉程序没有快速响应或程序已停止。解决方法有两种:使用后台线程和使用android提供的AsynTask类。
创建一个handler类的实例,后台线程向handler发送消息,然后刷新UI,达到快速响应的目的。handler通信的方式有两种:message和Runnable对象。下面是通过handler更新progressBar的例子的不同写法:
1、message对象的实例:
import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
public class ExpThreader extends Activity {
private ProgressBar pBar;
private Handler handler;
private Boolean isRunning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
lp.setMargins(10, 10, 10, 10);
pBar = new ProgressBar(this, null, R.attr.progressBarStyleHorizontal);
pBar.setProgress(0);
pBar.setMax(50);
layout.addView(pBar, lp);
setContentView(layout);
isRunning = true;
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Integer add = (Integer) msg.obj;
pBar.incrementProgressBy(add);
}
};
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100 && isRunning; i++) {
try {
Thread.sleep(200);
Message m = handler.obtainMessage(0, 1);// 1为message传递的add值
handler.sendMessage(m);//向handler发送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
isRunning = false;
}
}
2、
Runnable对象的post例子:
import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
public class ExpThreader extends Activity {
private ProgressBar pBar;
private Handler handler;
private Boolean isRunning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
lp.setMargins(10, 10, 10, 10);
pBar = new ProgressBar(this, null, R.attr.progressBarStyleHorizontal);
pBar.setProgress(0);
pBar.setMax(50);
layout.addView(pBar, lp);
setContentView(layout);
isRunning = true;
handler = new Handler();
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100 && isRunning; i++) {
try {
Thread.sleep(200);
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
pBar.incrementProgressBy(1);
}
});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
isRunning = false;
}
}
两个例子的效果是一样的,如图: