Android开发之异步消息处理

一、Message、Handler、MessageQueue和Looper

    1.新建Handler实例

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case UPDATE_TEXT: //UPDATE_TEXT为常量
                    mTvText.setText("改变文本");
                    break;
            }
        }
    };

    2.在子线程中,调用Handler.sendMessage(Message)方法

      Message message = new Message();
      message.what=UPDATE_TEXT;
      mHandler.sendMessage(message);

    3.原理

        3.1Message

            Message是传递的信息,可携带what、arg1、arg2等整形信息;

        3.2Handler

            用于发送消息和处理消息。

            Handler.sendMessage()方法发送消息。发送消息后,最终调用Handler.handleMessage()方法。

        3.3MessageQueue消息队列

            存放Handler发送的消息,这些消息等待被处理。每个线程只有一个MessageQueue对象。

        3.4Looper

            Looper管理MessageQueue。调用Looper.loop()方法后,进入无限循环,每当发现MessageQueue中存在消息,将

            它取出,调用handleMessage()方法。每个线程只有一个Looper对象。

        3.5总结

            Handler调用sendMessage()方法发送消息,消息发送到MessageQueue中,等待处理,Looper处理MessageQueue

            中的消息,调用handler.handleMessage()方法。

二、AsyncTask

        1.新建类继承自AsyncTask

         class DownloadTask extends AsyncTask<Void,Integer,Boolean>{

        泛型参数1:传入参数(如:传入下载Url)

        泛型参数2:显示进度的单位

        泛型参数3:返回结果类型(返回是否下载成功)

        2.重写AsyncTask的4个方法

     class DownloadTask extends AsyncTask<Void,Integer,Boolean>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.show();//显示进度对话框
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            try{
                while(true){
                    int downloadPercent = doDownload();//获取下载进度
                    publishProgress(downloadPercent);//更新UI的下载进度
                    if(downloadPercent>=100){
                        break;
                    }
                }
            }catch (Exception e){
                return false;//下载失败
            }
            return true;//下载成功
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressDialog.setMessage("下载"+values[0]+"%");//更新UI
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(aBoolean);
            progressDialog.dismiss();//关闭进度对话框
            if(result){
                //下载成功
            }else{
                //下载失败
            }
        }
    }

            2.1 onPreExecute()

                执行后台任务前调用,用于界面初始化,如显示进度条对话框。

            2.2 doInBackground(Params...)

                传入参数为泛型参数1;返回参数为泛型参数3;

                在子线程中调用,执行耗时操作。不能执行UI操作,可调用publishProgress(Progress...)方法进行UI跟新。

                执行完操作调用 return。

            2.3 onProgressUpdate(Progress...)

                传入参数为泛型参数2;

                调用了publishProgress()方法后,很快调用该方法。可进行UI操作,进行UI更新。

            2.4 onPostExecute(Result)

                传入参数为泛型参数3;

                当doInBackground()方法执行return后,很快调用该方法。

                可进行UI操作,如关闭

    3.启动任务

    new DownloadTask().excute();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值