Android基础学习之异步任务使用Handler

来源:互联网 发布:缠论均线指标公式源码 编辑:程序博客网 时间:2024/05/18 01:11

通常,一个程序中会有好几个线程或任务同时进行,有的快有的慢。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();    }}

效果:
这里写图片描述

0 0