Android中子线程与UI线程交互

来源:互联网 发布:软件开发心得体会 编辑:程序博客网 时间:2024/05/17 23:46

交互方式

1、handler
2、Activity.runOnUIThread(Runnable)
3、View.Post(Runnable)
4、View.PostDelayed(Runnabe,long)

5、AsyncTask

Handler

一个线程只能运行一个消息环即一个Thread对应一个Looper,一个Looper对应一个Thread;
APP运行的时候,在main方法调用Looper.prepareMainLooper和Looper.loop方法,因此主线程自带Looper,不需要开发者二次创建,同时我们可以在Activity中直接创建Handler;
那如何在自定义的Thread创建属于该线程的Looper呢?只需在Thread的run方法内部调用Looper.prepare,接着再调用Looper.loop即可,然后接着创建Handler对象即完成创建Looper和Handler与Looper绑定;
looper与线程关联的时候,looper会同时生产一个messageQueue。他是一个消息队列,looper会不停的从messageQuee中取出消息,也就是message。然后线程就会根据message中的内容进行相应的操作;
在创建Message对象的时候推荐使用obtainMessage方法来获取一个Message;
Handler负责发送Message并处理该Message(handleMessage方法);

AsyncTask

这里分为3个阶段:准备、过程、结果;
准备阶段对应着Params参数,对应着onPreExecute方法;
过程阶段对应着Progress参数,对应着doInBackground、onProgressUpdate方法;
结果阶段对应着Result参数,对应着onPostExecute方法;

onPreExecute运行在UI线程,主要目的是为后台线程的运行做准备。当他运行完成后,他会调用doInBackground方法。

doInBackground 运行在后台线程,他用来负责运行任务。他拥有参数Params,并且返回Result。在后台线程的运行当中,为了能够更新作业完成的进度,需要在 doInbackground方法中调用PublishProgress方法。该方法拥有参数Progress。通过该方法可以更新Progress的数 据。然后当调用完PublishProgress方法,他会调用onProgressUpdate方法用于更新进度。

onProgressUpdate运行在UI线程,主要目的是用来更新UI线程中显示进度的UI控件。他拥有Progress参数。在doInBackground中调用PublishProgress之后,就会自动调onProgressUpdate方法

onPostExecute运行在UI线程,当doInBackground方法运行完后,他会调用onPostExecute方法,并传入Result。在onPostExecute方法中,就可以将Result更新到UI控件上。

注意:AsyncTask实例只能执行一次

继承AsyncTask并在UI线程中创建实例,并调用execute方法,传入参数就可以了。
0 0
原创粉丝点击