通常,一个程序中会有好几个线程或任务同时进行,有的快有的慢。UI线程(也称main线程)是不允许阻塞的主线程,有时需要做一个耗时的任务时,为了不阻塞主线程,就会用到异步任务。
下面是使用Handler方法去怎么做到异步任务。
Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI。
作用:可定时或延时发消息。
//发消息对象
sendEmptyMessage(int) 发空消息
sendMessage(Message)
sendMessageAtTime(Message, long) //在哪个时刻发
sendMessageDelayed(Message, long) //延迟多久发
//发Runnable对象
post(Runnable)
postAtTime(Runnable, long)
postDelayed(Runnable, long)
用法:
class XXXActivity{
Handler handler=new Handler(){
handleMessage(msg){
//更新UI
}
};
onClick(){
download(...);
}
download(){
new Thread(){
//耗时任务
handler.sendXXXMessage(msg)
}.start();
}
}
示例:
1.定义一个测试xml布局
2.java代码
下面测试了两个异步任务,一个是模拟下载任务,一个是时钟任务
public class MainActivity extends Activity implements OnClickListener {
private TextView textView1;
private TextView textView;
private Button button;
private ProgressDialog pd;
private int value;
//利用Handler接收消息
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 123) {
if (msg.arg1 <= 100) {
pd.setProgress(value);
textView1.setText(value + "%");
}
}
if(msg.what == 456){
textView.setText(getDate());
handler.sendEmptyMessageDelayed(456, 1000);//每隔一秒钟发送一次消息
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView1 = (TextView) findViewById(R.id.textView1);
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
showProgeress();
}
//弹出进度条对话框
private void showProgeress() {
pd = new ProgressDialog(this);
pd.setTitle("后台任务");
pd.setMessage("正在下载,请稍后...");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
//将更新进度放在子线程中
new Thread() {
@Override
public void run() {
while (true) {//利用死循环不断发布进度
try {
Thread.sleep(500);//模拟下载进度时间
} catch (InterruptedException e) {
e.printStackTrace();
}
value += 1;
//隔一定时间发送一次消息和值
Message msg = Message.obtain();//从消息池中获取消息对象,避免重复创建
msg.what = 123;//消息ID
msg.arg1 = value;//消息的第一个值(消息可以附带两个值:arg1和arg2)
handler.sendMessage(msg);//发送消息
if (value == 100) {//当进度满跳出死循环
break;
}
}
pd.dismiss();//关闭对话框
}
}.start();
}
public String getDate() {
Calendar c = Calendar.getInstance();//Calendar对象可获取系统对象
String year = String.valueOf(c.get(Calendar.YEAR));
String month = String.valueOf(c.get(Calendar.MONDAY));
String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH) + 1);
String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY));
String mins = String.valueOf(c.get(Calendar.MINUTE));
String seconds = String.valueOf(c.get(Calendar.SECOND));
return year + "-" + month + "-" + day + " " + hour + ":" + mins + ":"
+ seconds;
}
@Override
protected void onStart() {
if(handler!=null){
handler.sendEmptyMessage(456);//发送消息,参数:消息ID
}
super.onStart();
}
@Override
protected void onStop() {
if(handler!=null){
handler.removeMessages(456);//移除消息,但不调用消息处理方法
}
super.onStop();
}
}
效果: