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

通常,一个程序中会有好几个线程或任务同时进行,有的快有的慢。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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值