导航:首页 > 操作系统 > android主线程向子线程发消息

android主线程向子线程发消息

发布时间:2022-08-24 08:50:27

1. 能讲讲android的Handler机制吗

Android的Handler机制是通俗讲为了互相发消息,一般是子线程给主线程发消息完成相应操作。

安卓中最常见的操作是子线程操作完事后得到数据想更新UI,安卓有规定不允许在子线程中刷新UI,所以Handler出现了。

使用和理解大致步骤。

  1. 创建全局Handler对象handler,然后在主线程中初始化它(一般在oncreate中),把它的handmessage里面的方法重写,这个方法是收到子线程发给它的消息后执行的逻辑。

  2. 在子线程中获取数据,调用handler.sendmessage,把要发的消息放在message中。message会添加到Messagequue(消息队列中,handler创建就带的)。

3.对象handler被创建和初始化的时候,系统自动会启动Handler.looper,也就是一个消息轮询器,它不断的去查看有没有消息进入到Messagequue(消息队列中),有就取出交给handler的handmessage去处理。//这段逻辑是系统自动执行,理解就行。*纯手打,不骗人~~~

2. 面试被问到android中两个子线程怎么通信,我懵了。

构造HandlerThread类的对象mHandlerThread,这样生成一个子线程可以调用new MyHandler(mHandlerThread.getLooper())来获取子线程的handler,另一个子线程发消息,收到消息的就是子线程而不是主线程了。

3. android中什么时候会选择用广播来进行线程间的通信

android中什么时候会选择用广播来进行线程间的通信 Android 多线程 通信

线程中通信就不要用广播了吧 进程中通信可以用广播或者aidl

可是,这两天看到的项目都是这么做的;然后,自己分析了下,觉得一下的理由也是可以成立的;

1.正常情况下我们选择handler消息机制来进行单向的线程间的通信;(工作线程向主线程发送消息)

因为主线程有现成的handler,而工作线程没有现成的handler,这样的话,主线程将handler交给工作线程而让工作线程将工作的结果交给主线程;

相反,工作线程中没有现成的handler(事实上是没有消息队列,也就是handler没有绑定到工作线程),那么,如果开辟的话,代码角度上是挺麻烦的(相对应广播机制来说);

2.广播机制本身就是双向的(工作线程向主线程发送广播,主线程向工作线程发送广播);

//另外,对于像一个activity中通过fragment来进行界面的处理; 我们大多数情况下是采用广播的机制来实现fragment中adapter的数据的更新;这样做主要是考虑到工作线程的任务加载完成,而具体的对应刷新的activity可能还没有启动;

另外,基于接口隔离原则,如果用handler进行通信的话,则不能很好的满足这一原则;

你要是周期比较长 用广播好些吧

应该与周期关系不是很密切。最主要的原因是两条线成是双向通信。

Handler类似于P2P的通信。
广播则类似于一个server端,用来处理分发不同线程的请求,从控制器的角度来说用广播更好一点。

一般使用Handler的,多用于子线程处理事务,完成时告知主线程这一类的情况。
而类似楼主所说的多条线程之间需要频繁交互的话,广播是个很好的选择,并且结构清晰,只是不知道广播的性能与handler相比会怎么样。

4. android线程间通信有哪些方式

进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
  线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
  区别:
  (1)、一个程序至少有一个进程,一个进程至少有一个线程;
  (2)、线程的划分尺度小于进程,使得多线程程序的并发性高;
  (3)、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
---------------------
一、Android进程间通信方式
1.Bundle
  由于Activity,Service,Receiver都是可以通过Intent来携带Bundle传输数据的,所以我们可以在一个进程中通过Intent将携带数据的Bundle发送到另一个进程的组件。
  缺点:无法传输Bundle不支持的数据类型。
2.ContentProvider
  ContentProvider是Android四大组件之一,以表格的方式来储存数据,提供给外界,即Content Provider可以跨进程访问其他应用程序中的数据。用法是继承ContentProvider,实现onCreate,query,update,insert,delete和getType方法,onCreate是负责创建时做一些初始化的工作,增删查改的方法就是对数据的查询和修改,getType是返回一个String,表示Uri请求的类型。注册完后就可以使用ContentResolver去请求指定的Uri。
3.文件
  两个进程可以到同一个文件去交换数据,我们不仅可以保存文本文件,还可以将对象持久化到文件,从另一个文件恢复。要注意的是,当并发读/写时可能会出现并发的问题。
4.Broadcast
  Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播。
5.AIDL方式
  Service和Content Provider类似,也可以访问其他应用程序中的数据,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。
6.Messenger
  Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。
  双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。
7.Socket
  Socket方法是通过网络来进行数据交换,注意的是要在子线程请求,不然会堵塞主线程。客户端和服务端建立连接之后即可不断传输数据,比较适合实时的数据传输
二、Android线程间通信方式
  一般说线程间通信主要是指主线程(也叫UI线程)和子线程之间的通信,主要有以下两种方式:
1.AsyncTask机制
  AsyncTask,异步任务,也就是说在UI线程运行的时候,可以在后台的执行一些异步的操作;AsyncTask可以很容易且正确地使用UI线程,AsyncTask允许进行后台操作,并在不显示使用工作线程或Handler机制的情况下,将结果反馈给UI线程。但是AsyncTask只能用于短时间的操作(最多几秒就应该结束的操作),如果需要长时间运行在后台,就不适合使用AsyncTask了,只能去使用Java提供的其他API来实现。
2.Handler机制
  Handler,继承自Object类,用来发送和处理Message对象或Runnable对象;Handler在创建时会与当前所在的线程的Looper对象相关联(如果当前线程的Looper为空或不存在,则会抛出异常,此时需要在线程中主动调用Looper.prepare()来创建一个Looper对象)。使用Handler的主要作用就是在后面的过程中发送和处理Message对象和让其他的线程完成某一个动作(如在工作线程中通过Handler对象发送一个Message对象,让UI线程进行UI的更新,然后UI线程就会在MessageQueue中得到这个Message对象(取出Message对象是由其相关联的Looper对象完成的),并作出相应的响应)。
三、Android两个子线程之间通信
  面试的过程中,有些面试官可能会问Android子线程之间的通信方式,由于绝大部分程序员主要关注的是Android主线程和子线程之间的通信,所以这个问题很容易让人懵逼。
  主线程和子线程之间的通信可以通过主线程中的handler把子线程中的message发给主线程中的looper,或者,主线程中的handler通过post向looper中发送一个runnable。但looper默认存在于main线程中,子线程中没有Looper,该怎么办呢?其实原理很简单,把looper绑定到子线程中,并且创建一个handler。在另一个线程中通过这个handler发送消息,就可以实现子线程之间的通信了。
  子线程创建handler的两种方式:
  方式一:给子线程创建Looper对象:
new Thread(new Runnable() {
public void run() {
Looper.prepare(); // 给这个Thread创建Looper对象,一个Thead只有一个Looper对象
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();
}
};
handler.sendEmptyMessage(1);
Looper.loop(); // 不断遍历MessageQueue中是否有消息
};
}).start();
---------------------
方式二:获取主线程的looper,或者说是UI线程的looper:
new Thread(new Runnable() {
public void run() {
Handler handler = new Handler(Looper.getMainLooper()){ // 区别在这!!!
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();
}
};
handler.sendEmptyMessage(1);
};
}).start();

5. 安卓开发主线程获取子线程消息

向子线程中传入Context, 发送广播, Activity中接收广播即可。

6. Android主线程如何向分线程发送消息

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

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

7. C#写Android应用时handler和message要怎么用

handler的方法中有post();里面的参数为Runnable类型,一般在主线程中建立handler,子线程向其发送消息,使其更新UI界面,在主线程中,可以通过post(),将Runnable()中的任务加入主线程的消息队列中;

在子线程中,是没有消息队列的,需要自己创建,在主线程中,系统会帮我们创建一个消息队列;
Looper负责消息的传递
这样子线程就可以用post将Runnbale()加入到消息队列中去,这样主线程都可以向子线程发送消息了,如:按钮(点击后发送消息)
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();//Looper准备
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();//让Looper动起来
}
}
原则是:先建立Handler,再发送消息,或者post();
Handler的函数在所有线程中均可使用,利用内部类实现;

8. 如何使用Handler实现主线程往子线程传递消息

myThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (handler == null) {
Looper.prepare();
handler = new Handler(Looper.myLooper()){//这里加上
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){
case do_some_th:break;
}
}
};
myHandler.sendEmptyMessage(1);
Looper.loop();
Log.e("", "这是消息循环开始之后的代码");
}
}
});

//主线程给子线程发消息:
在主线程里面调用handler.sendEmptyMessage(do_some_th);就可以执行了。

9. Android:主线程如何向子线程发送消息

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

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

阅读全文

与android主线程向子线程发消息相关的资料

热点内容
怎么把安卓视频传到苹果上面 浏览:79
手机拍鬼片用什么app 浏览:640
爬山虎app是干什么用的 浏览:505
有哪些写给程序员的歌 浏览:49
成都市命令 浏览:993
建立系列文件夹 浏览:983
苹果开机白屏带文件夹问号 浏览:733
体验服为什么服务器会关闭 浏览:41
酒店命令 浏览:750
中走丝线切割编程视频 浏览:80
衣服压缩袋手泵原理 浏览:714
通达信编程书籍 浏览:981
车用压缩天然气瓶阀 浏览:971
鞋的程序员 浏览:259
车的压缩比是什么意思 浏览:202
网站源码怎么传到文件夹 浏览:914
海南压缩机在哪里 浏览:491
电脑文件夹清晰的文件结构 浏览:839
如何把苹果手机的app转到安卓 浏览:305
java同步并发 浏览:249