轉自:http://blog.sina.com.cn/s/blog_4e1e357d0102wau9.htmlhtml
1.bus工程實現經過service實現aidl實體類linux
2.actor工程經過發起bindservice,根據action去啓動遠程(跨進程的)bus上的aidl。
那麼問題來了,咱們知道,linux系統進程間通訊,各個進程間資源是隔離的,兩個進程間須要通訊,就要把msg轉換成底層os系統可以識別的數據單元,在Android裏面的方案是aidl+parcelbal的序列化。
爲了模擬和測試aidl的性能問題,我作了個簡單實驗,在Android中,進程間通訊經過binder實現,bind是通訊的數據載體,當序列化後的數據單元過大時,就會出問題,報出android.os.TransactionTooLargeException。
官方文檔裏有說明,最大一般限制爲1M.也就是說若是大於1M數據的話,就應該分開傳。理論上說,應該都是對象和字符串類型的數據爲主,只要不是大圖片實體等問題,通常應該夠用。
我這邊作了一個測試,序列化傳送了450k的String被序列化 後的數據,耗時使用了33秒的時間。
try {
StringBuilder sb = new StringBuilder();
for(int i = 0;i< 30;i++){
sb.append(new String (stringMsg));
}
System.out.println( "actor time start :" + System.currentTimeMillis());
binder.sendMsg("msg from actor : " + sb.toString());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
------
public static BusCore coreBinder = new BusCore.Stub() {
@Override
public void sendMsg(String msg) throws RemoteException {
Log.d("", " RemoteBusCoreService msg:" + msg);
System.out.println("buscore time end :" + System.currentTimeMillis());
}
};
對於遠程服務,必須調用 bindService()方法,而不是 startService()方法。
今天恰好是在作框架性 實現方案測試時,稍微檢測了下個,mark下。
技術討論,資料分享請加我QQ入羣,爲了羣的乾淨有秩序,因此有2元入羣費要求,羣裏所收穫保證不止2元