1. 程式人生 > >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基礎學習程序執行通訊方式總結

        首先介紹一下程序和執行緒的基本概念及兩者之間的區別:   程序:是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。   執行緒:是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本

(轉)C++程序執行通訊

 1.許多程式和應用一起工作達到某個共同目的的任務集。每個任務在開始執行前等待前一個任務完成。為了完成共同目標,相關執行緒或程序必須相互合作與通訊。 2.依賴關係:對於任意兩個執行緒或程序,存在4種依賴關係(如圖)  (1)通訊依賴性:當執行緒A需要來自執行緒B

windows C++程序執行通訊

程序間通訊 程序基本概念 In computer science, inter-process communication or interprocess communication (IPC) refers specifically to the

Android程序通訊執行通訊

程序間和執行緒間通訊 這個知識點算是高階知識點, 執行緒和程序 首先要區分執行緒和程序的區別: 執行緒是cup最小排程單元; 程序是一系列執行緒的集合。 其實區分程序和執行緒通訊有一個很好的方法:程式是否重新起了一個虛擬機器,因為不同程序會啟動不

程序通訊執行同步區別

執行緒間通訊:由於多執行緒共享地址空間和資料空間,所以多個執行緒間的通訊是一個執行緒的資料可以直接提供給其他執行緒使用,而不必通過作業系統(也就是核心的排程)。 程序的通訊機制主要有:管道、有名管道、訊息佇列、訊號量、共享空間、訊號、套接字。 linux中程序間通訊和執行緒間通訊的區別:

ZeroMQ介面函式 :zmq_inproc – ØMQ 本地程序內(執行)傳輸方式

————————————————————————————————————— zmq_inproc(7)   ØMQ Manual - ØMQ/4.2.0 Name zmq_inproc – ØMQ 本地程序內(執行緒間)傳輸方式 Synopsis 程序內傳輸方式意味著在共享ZMQ con

學習筆記智慧指標執行安全內容筆記

使用shared_ptr控制物件的生命週期,常用來進行物件的建立,屬於強引用,只要被shared_ptr引用該物件就不會被析構 weak_ptr是一種弱引用,常常用來偵查物件是否存在,不控制物件的生命期,也不會增加物件的引用計數如果物件還存在沒被析構那麼可以通過成員函式進行

android基礎學習Fragment

一、概述 All subclasses of Fragment must include a public no-argument constructor. 所有的Fragment的子類都必須包括一個不含引數的建構函式。 Interaction with

程序執行通訊方式程序執行的區別

近日想總結下程序間,執行緒間的通訊方式,在網上搜索了下,感覺寫的很好,照搬過來,當做加深記憶。 幾種程序間的通訊方式 (1) 管道(pipe):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有血緣關係的程序間使用。程序的血緣關係通常指父子程序關係。 (2)有名管道(named p

程序ipc執行ipc

每個程序有自己的地址空間。兩個程序中的地址即使值相同,實際指向的位置也不同。程序間通訊一般通過作業系統的公共區進行。 同一程序中的執行緒因屬同一地址空間,可直接通訊。 不僅是系統內部獨立執行的實體,而且是獨立競爭資源的實體。 執行緒也被稱為輕權程序,同一程序的執行緒共享全域性變數和記憶體,使得執行緒

程序同步執行同步

怎樣同步多個執行緒或多個程序的活動。為允許線上程或程序間共享資料,同步是必需的。 互斥鎖和條件變數是同步的基本組成部分。互斥鎖和條件變量出自POSIX.1執行緒標準,它們總是可用來同步一個程序內的各個執行緒的。如果一個互斥鎖或條件變數存放在多個程序間共享的某個記憶體中,那麼POSIX

程序執行池實現高併發伺服器

思想:   1.  建立與伺服器相同cpu個數的程序個數來監聽(accept)客戶端響應,並在每個程序中先建立好一個執行緒池   2.  有客戶端訪問時,解除其中一個程序的accpet阻塞,進入到執行緒中來執行接收資料工作( recv() ),用執行緒防止recv阻塞,執行緒呼叫recv方法   3. 

Netty框架學習(四):執行模型

轉載自:https://www.cnblogs.com/TomSnail/p/6158249.html 1. Proactor和Reactor Proactor和Reactor是兩種經典的多路複用I/O模型,主要用於在高併發、高吞吐量的環境中進行I/O處理。 I/O多路複用機制都依

Python系列程序池與執行

在剛開始學多程序或多執行緒時,我們迫不及待地基於多程序或多執行緒實現併發的套接字通訊,然而這種實現方式的致命缺陷是:服務的開啟的程序數或執行緒數都會隨著併發的客戶端數目地增多而增多,這會對服務端主

程序(process)執行(thread)

來源:阮一峰 程序(process)和執行緒(thread)是作業系統的基本概念,但是它們比較抽象,不容易掌握。 其實做一個很好的類比,就可以把它們解釋地清晰易懂。 1.計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。 2.假定工廠的電力有限,一

Java多執行建立任務執行

Runnable建立執行緒 任務就是物件。為了建立任務,必須首先為任務定義一個類。任務類必須實現Runnable介面。Runnable介面非常簡單,它只包含一個run方法。需要實現這個方法來告訴系統執行緒將如何執行。開發一個任務類的模板如圖29-2a所示。

CIL鎖,GIL與執行池的區別,程序執行池,同步與非同步

一.GIL鎖 什麼是GIL? 全域性直譯器鎖,是加在直譯器上的互斥鎖 GC是python自帶的記憶體管理機制,GC的工作原理:python中的記憶體管理使用的是應用計數,每個數會被加上一個整型的計數器,表示這個資料被引用的次數,當這個整數變為0時則表示該資料已經沒有人使用,成為了垃圾資料,當記憶體佔用達到

程序執行通訊方式

一、程序間的通訊方式 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 有名管道 (namedpipe)

JUC學習筆記(2)—執行通訊

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; cla

執行學習(二):執行的資料共享

資料不共享的情況 public class MyThread04 extends Thread{ private int count=5; public MyThread04(String threadName) { this.setName(threadName); }