android通信,Android网络通信

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();

---------------------

了解Android进程间通信的四种方式

由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在android 

SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组

件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应

用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形

式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向

android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;

Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content 

Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫

AIDL服务。

Android进程间通信

1. 简要说说进程与线程的区别和联系。

2. 应用内使用多进程可能导致哪些问题?

当一个APP启用了多进程后,系统会为不同的进程分配不同的内存空间,因此所有需要通过内存共享的行为都会失败。另外,还会导致以下几个问题:

3. Android中有哪些进程间通信方式?

由于不同的进程拥有不同的数据空间,所以无论是应用内还是应用间,均无法通过共享内存来实现进程间通信。

进程和线程的主要区别(总结) - CSDN

线程和进程的区别是什么? - 知乎

Android 多进程通信之几个基本问题

面试题:IPC(跨进程通信)

当前文章:android通信,Android网络通信
文章网址:https://www.cdcxhl.com/article8/phpeop.html

成都网站建设公司_创新互联,为您提供外贸网站建设网站改版云服务器微信小程序做网站网站设计

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

h5响应式网站建设