android 后台怎么向ui主线程中发送消息

作者&投稿:坚柯 (若有异议请与网页底部的电邮联系)
Android:主线程如何向子线程发送消息~

因为你是在主线程创建的handler实例,比如你是这样实例化handler

那么我们进到handler源码看一下

可以看到这里会调用重载的另外一个构造方法,我们再跟进

我们可以看到 mLooper=looper.myLooper(); 这是获取当前线程的looper实例,也就是主线程的looper。所以当发送消息的时候主线程就可以获取到消息。往下看系统还会mLooper是否为空,如果为空就会抛出异常,意思是当前线程没有looper实例,这也是我们在子线程中没有创建looper的实例的时候创建handler会报错的原因,主线程不会报错是因为程序在启动的时候在activitythread中的main方法就创建了looper实例,看系统源码


然后调用looper.loop();就开始了消息循环。这就是为什么在主线程发消息住线程还能收到消息的原因。因为发送消息的实例是在主线程实例化的就有了主线程的looper。

  据我所知android提供了以下几种方法,用于实现后台线程与UI线程的交互。


  1、handler


  2、Activity.runOnUIThread(Runnable)


  3、View.Post(Runnable)


  4、View.PostDelayed(Runnabe,long)


  5、AsyncTask


  


  方法一:handler


  handler是android中专门用来在线程之间传递信息类的工具。


  要讲明handler的用法非常简单,但是我在这里会少许深入的讲一下handler的运行机制。


  为了能够让handler在线程间传递消息,我们还需要用到几个类。他们是looper,messageQueue,message。


  这里说的looper可不是前段时间的好莱坞大片环形使者,他的主要功能是为特定单一线程运行一个消息环。一个线程对应一个looper。同样一个looper对应一个线程。这就是所谓的特定单一。一般情况下,在一个线程创建时他本身是不会生产他特定单一的looper的(主线程是个特例)。因此我们需要手动的把一个looper与线程相关联。其方法只需在需要关联的looper的线程中调用Looper.prepare。之后我们再调用Looper.loop启动looper。


  说了这么多looper的事情,到底这个looper有什么用哪。其实之前我们已经说到了,他是为线程运行一个消息环。具体的说,在我们将特定单一looper与线程关联的时候,looper会同时生产一个messageQueue。他是一个消息队列,looper会不停的从messageQuee中取出消息,也就是message。然后线程就会根据message中的内容进行相应的操作。


  那么messageQueue中的message是从哪里来的哪?那就要提到handler了。在我们创建handler的时候,我们需要与特定的looper绑定。这样通过handler我们就可以把message传递给特定的looper,继而传递给特定的线程。在这里,looper和handler并非一一对应的。一个looper可以对应多个handler,而一个handler只能对应一个looper(突然想起了一夫多妻制,呵呵)。这里补充一下,handler和looper的绑定,是在构建handler的时候实现的,具体查询handler的构造函数。


  在我们创建handler并与相应looper绑定之后,我们就可以传递message了。我们只需要调用handler的sendMessage函数,将message作为参数传递给相应线程。之后这个message就会被塞进looper的messageQueue。然后再被looper取出来交给线程处理。


  这里要补充说一下message,虽然我们可以自己创建一个新的message,但是更加推荐的是调用handler的obtainMessage方法来获取一个message。这个方法的作用是从系统的消息池中取出一个message,这样就可以避免message创建和销毁带来的资源浪费了(这也就是算得上重复利用的绿色之举了吧)。


  突然发现有一点很重要的地方没有讲到,那就是线程从looper收到message之后他是如何做出响应的嘞。其实原来线程所需要做出何种响应需要我们在我们自定义的handler类中的handleMessage重构方法中编写。之后才是之前说的创建handler并绑定looper。


  好吧说的可能哟点乱,总结一下利用handler传递信息的方法。


  假设A线程要传递信息给B线程,我们需要做的就是


  1、在B线程中调用Looper.prepare和Looper.loop。(主线程不需要)


  2、 编写Handler类,重写其中的handleMessage方法。


  3、创建Handler类的实例,并绑定looper


  4、调用handler的sentMessage方法发送消息。




龙马潭区17252627086: android AsyncTask 怎么返回值给UI线程 -
温玉赖氨: 你新建的类extends AsyncTask后要提供三个泛型参数,并且重载你需要的方法, 三个参数Params,Progress和Result,最后一个就是后台操作后可以返回的值,看例子 public class ProgressBarAsyncTask extends AsyncTask{/*** 这里的String参...

龙马潭区17252627086: Android 怎么启动一个工作线程及线程如何与UI线程交互 -
温玉赖氨: 通过Handler通知UI线程,更新状态信息,部分代码,请参阅下面: private void SynTask() { new Thread() { @Override public void run() { if (IsHaveInternet()){// 联网 DowloadData();//下载数据 //通知UI Message msg = new Message(); msg.what ...

龙马潭区17252627086: android中怎么区分UI主线程和子线程 -
温玉赖氨: 在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在...

龙马潭区17252627086: 如何在service执行runOnUIThread -
温玉赖氨: 一、Handler的定义:主要接受子线程发送的数据,并用此数据配合主线程更新UI.解释:当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,你要是点击一个Button,Android会分

龙马潭区17252627086: android中 IO操作可以放在主线程么.为什么? -
温玉赖氨: Android的io操作就是需要放在主线程中,不过这个操作的过程最好放在其他的线程,这样子才不会是屏幕出现卡顿.如果你直接放在其他线程就会导致出错,android这么规定的

龙马潭区17252627086: android 怎么在线程里更新ui么 -
温玉赖氨: 没有所谓好不好,在其他线程更新UI最终还是转变为在UI线程里更新,因为UI线程是主线程,其他线程想直接操作UI是不行的,可以借助Handler and message机制.如果你的功能逻辑复杂度较高,就是说运行时间较长,那么最好是另开一个线程做逻辑处理,然后用message通知UI线程更新,如果只是简单的、耗时很短的处理,那么直接在UI线程处理就OK了

龙马潭区17252627086: Android中怎么让子线程执行完后在执行UI线程 -
温玉赖氨: 你所说的是线程同步问题,给你提供三个思路:1,使用同步监视器进行线程同步;2,使用同步方法;3,使用同步锁LOCK对方法进行加锁.如果这三块不知道,建议先看看Java基础知识中的线程同步问题.

龙马潭区17252627086: android AsyncTask的方法在哪几个线程中调用 -
温玉赖氨: 在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验.但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错...

龙马潭区17252627086: 如何实现android和服务器长连接 -
温玉赖氨: 1:android客户端通过service在后台通过servreScoket不断的accept,一旦有相应的socket到达,则启动一个线程去处理 2::在线程中处理完返回给我们android客户端的消息或任务之后,要将这种结果表现在ui上,这个步骤方法就比较多了,例...

龙马潭区17252627086: 在多线程中,子线程更新主线程ui有哪些方法及注意点 -
温玉赖氨: Android UI多线程Androidthread工作 在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网