Android解析异步消息处理机制,Handler原理(第二行代码 10.2.3)

来源:互联网 发布:数据统计表 编辑:程序博客网 时间:2024/05/06 22:55

android中的异步消息处理机制分为四个部分

1、Message(线程间传递信息,可携带少量信息,如what还可携带obj对象 arg1 arg2)
2、Handler(译为:处理者 用于发送消息Handler.sendMessage 和处理消息handlerMessage,)
3、MessageQueue(消息队列,即存放消息的地方(handler发送的所有表消息在这里等待被处理),每个线程只有一个MessageQueue对象)
4、Looper(loop(循环),looper暂译循环者,负责管理MessageQueue,调用它的loop方法将无线循环MessageQueue中的消息并取出传递给Handler的handlerMessage()中,每个线程只有一个Lopper对象)


Handler的使用如下(这里是一个更新imageview的例子)

private Handler handler =new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case UPDATE_IMAGE:                    img.setImageResource(R.mipmap.avatar_def);                    break;            }        }    };

在主线程声明一个Handler对象,并重写handlerMessage方法

new Thread(new Runnable() {                    @Override                    public void run() {                        Message message =new Message();                        message.what=UPDATE_IMAGE;                        handler.sendMessage(message);                    }                }).start();

通过new Thread方法创建一个子线程
在子线程中创建Message 对象并给Message对象的what字段赋值(这里也可以是obj对象),然后通过handler发送message对象,至此发送到MessageQueue中,looper会无线循环取消息将它取出来,回调dispathchMessage()方法将消息分发回handlerMessage方法中去处理,handlerMessage是在主线程中执行的,而发送消息是在子线程中进行。

AsyncTask(异步任务)

AsyncTask(方便在子线程中对UI进行操作,原理也是基于异步消息处理机制的)

class DownAsyncTask extends AsyncTask<void,Integer,Boolean>{        @Override        protected void onPostExecute(Boolean aBoolean) {            super.onPostExecute(aBoolean);        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);        }        @Override        protected Boolean doInBackground(Void... voids) {            return null;        }        @Override        protected void onPreExecute() {            super.onPreExecute();        }    }

传入三个泛型 第一个void代表执行AsyncTask时不需要传入任何参数给后台任务,第二个Integer代表进度显示单位,第三个Boolean反馈执行结果
重写AsyncTask的方法
1、onPreExecute(后台任务开始执行之前调用,用于界面上的初始化操作,比如显示进度条等等)
2、doInBackground(这个方法的所有代码在子线程中执行,在这里处理耗时操作,一旦完成即可通过return 返回执行结果,不可进行UI操作,如果需要更新UI,比如说反馈当前进度,可以调用publishProgress(Progress…)方法来完成)
3、onProgressUpdate(在后台任务调用了publishProgress(Progress…)方法后这个方法就会很快被调用,该方法中的参数就是后台传过来的,可在这个方法进行UI操作,利用参数的值进行界面的更新)
4、onPostExecute(后台任务执行完毕,通过return语句进行返回时,这个方法就很快被调用.返回的数据会作为参数传递到此方法中去,可以利用返回的数据进行UI操作,比如提醒结果或关闭进度条)

简单来说就是在doInBackground方法中去执行具体耗时任务,比如说网络请求数据,在onProgressUpdate方法中进行UI操作,在onPostExecute方法中执行一些任务的收尾操作; 执行任务只需 new DownAsyncTask().execute;

0 0
原创粉丝点击