android线程间通信的几种方法_Android进程间和线程间通信方式

android线程间通信的几种方法_Android进程间和线程间通信方式进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。区别:(1)、一个程序至少有一个进程,一个进…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程:是进程的一个实体,是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();

———————

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188169.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Delphi XE5中的新增内容

    Delphi XE5中的新增内容DelphiXE5中的新增内容DelphiXE5是所有Delphi开发人员的必须备升级,并且是来自Embarcadero的获奖的、多设备应用开发解决方案的最新版本。使用DelphiXE5的新特性,以交付应用Android、iOS、Windows和OSX。以PC机、平板电脑和智能手机为目标,更轻松地与更多数据连接-等等!DelphiXE5中的新特性针对设

    2022年7月18日
    16
  • 关系数据模型——三个组成部分「建议收藏」

    关系数据模型——三个组成部分「建议收藏」关系模型的三个组成部分,是指关系数据模型的数据结构、关系数据模型的操作集合和关系数据模型的完整性约束。关系数据模型的数据结构主要描述数据的类型、内容、性质以及数据间的联系等,是目标类型的集合。目标类型是数据库的祖成成分,一般可分为两类:数据类型、数据类型之间的联系。关系数据模型的操作集合数据模型中数据操作主要描述在相应的数据结构上的操作类型和操作方式。它是操作算符的集合,包括若干操作和推理准则,用以对目标类型的有效实例所组成的数据库进行操作。关系数据模型的完整性约束数据模型中的数据约束主要描

    2022年4月19日
    59
  • 什么是大数据,大数据的处理流程,主要分为哪几步?[通俗易懂]

    一、大数据是什么?大数据,bigdata,《大数据》一书对大数据这么定义,大数据是指不能用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。这句话至少传递两种信息:1、大数据是海量的数据2、大数据处理无捷径,对分析处理技术提出了更高的要求二、大数据的处理流程下图是数据处理流程:1、底层是数以千亿计的数据源,数据源可以是SCM(供应链数据),4PL(物流数据),CRM(客…

    2022年4月11日
    51
  • Quadro P5200 – 最强大的移动工作站显卡 专门为了惠普 VR Z 背包电脑而发布

    Quadro P5200 – 最强大的移动工作站显卡 专门为了惠普 VR Z 背包电脑而发布https://www.leiphone.com/news/201708/Z1MCetuoobEaHIqa.html前言在今年的计算机图形技术顶会SIGGRAPH,英伟达并不是在单纯地展示自家的

    2022年8月6日
    22
  • Linux查找文件名_find命令查找文件夹名

    Linux查找文件名_find命令查找文件夹名linux下面查找文件夹名称find/-namedirName-d

    2022年10月25日
    0
  • SpringSecurity(十二)—-基于表达式的访问控制

    SpringSecurity(十二)—-基于表达式的访问控制

    2020年11月12日
    258

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号