動態圖片演示,原始碼直析:手把手講解IPC框架,最新整理

歡喜程式設計發表於2021-09-22
public  class  ServiceActivity  extends  AppCompatActivity {

@Override
protected  void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 startService(new  Intent(this, MyService.class));//服務端,app啟動之後,自動啟動服務
}
}
public  class  MyService  extends  Service {

ConcurrentMap<String, UserInfoBean> map;
@Nullable
@Override
public  IBinder onBind(Intent intent) {
 map = new  ConcurrentHashMap<>();
 for (int i = 0; i < 100; i++) {
  map.put("name" + i, new  UserInfoBean("name" + i, "accountNo" + i, i));
 }
 return  new  IUserInfo.Stub() {
  //資料接收器 Stub
  @Override
  public  UserInfoBean getInfo(String name) {
   return map.get(name);
  }
 }
 ;
}
@Override
public  void onCreate() {
 super.onCreate();
 Log.e("MyService", "onCreate: success");
}
}

客戶端 核心程式碼 :

public  class  ClientActivity  extends  AppCompatActivity {

private  TextView resultView;
private  String TAG = "clientLog";
private  int i = 0;
@Override
protected  void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 initView();
}
private  void initView() {
 resultView = findViewById(R.id.resultView);
 findViewById(R.id.connect).setOnClickListener(new  View.OnClickListener() {
  @Override
  public  void onClick(View v) {
   bindService();
  }
 }
 );
 findViewById(R.id.disconnect).setOnClickListener(new  View.OnClickListener() {
  @Override
  public  void onClick(View v) {
   try {
    unbindService(connection);
    resultView.setText("嘗試釋放");
   }
   catch (IllegalArgumentException e) {
    resultView.setText("已經釋放了");
   }
  }
 }
 );
 findViewById(R.id.btn).setOnClickListener(new  View.OnClickListener() {
  @Override
  public  void onClick(View v) {
   if (iUserInfo != null) {
    try {
     ((Button) v).setText("查詢name為:name" + ((i++) + 1) + "的UserInfoBean");
     UserInfoBean bean = iUserInfo.getInfo("name" + i);
     if (bean != null)
     resultView.setText(bean.toString()); else
     resultView.setText("沒找到呀");
    }
    catch (RemoteException e) {
     e.printStackTrace();
    }
   } else {
    resultView.setText("沒有連線上service");
   }
  }
 }
 );
}
//作為IPC的客戶端,我們需要 建立起和Service的連線
private  IUserInfo iUserInfo;
//操作控制程式碼,可以透過它向service傳送資料
private  void bindService() {
 if (iUserInfo == null) {
  Intent intent = new  Intent();
  intent.setComponent(new  ComponentName(
  "study.hank.com.aidl_service",
  "study.hank.com.aidl_service.MyService"));
  bindService(intent, connection, Context.BIND_AUTO_CREATE);
  resultView.setText("嘗試連線");
 } else {
  resultView.setText("已經連線上service" + iUserInfo);
 }
}
private  ServiceConnection connection = new  ServiceConnection() {
 @Override
 public  void onServiceConnected(ComponentName name, IBinder service) {
  iUserInfo = IUserInfo.Stub.asInterface(service);
  resultView.setText("連線成功");
  Log.d(TAG, "connection:" + "連線成功");
 }
 @Override
 public  void onServiceDisconnected(ComponentName name) {
  iUserInfo = null;
  resultView.setText("連線 已經斷開");
  Log.d(TAG, "connection:" + "已經斷開");
 }
}
;
@Override
protected  void onDestroy() {
 super.onDestroy();
 unbindService(connection);
}
}

很容易發現,服務端的程式碼量尚可,不是很複雜,但是客戶端這邊,要處理 connection ,要手動去繫結以及解綁 Service ,所有參與通訊的 javabean 還必須實現序列化介面 parcelable Demo 中只有一個客戶端,還不是很明顯,但是如果有 N 個客戶端 Activity 都需要與 service 發生通訊,意味著每一個 Activity 都必須寫類似的程式碼. 不但 累贅 ,而且 醜陋 .

前方高能

不使用RPC框架時,CS兩端的程式碼的結構,已經有了大致的印象,下面是 使用IPC框架時 客戶端、服務端 的核心程式碼

客戶端

動態圖片演示,原始碼直析:手把手講解IPC框架,最新整理

之前的 bindService 呢?沒了。客戶端使用此框架來進行 程式通訊,不用去關心 AIDL 怎麼寫了,不用關注 bindService,ServiceConnection ,省了很多事。

服務端

動態圖片演示,原始碼直析:手把手講解IPC框架,最新整理

對比 使用框架前後,我們的核心程式碼的變化

有什麼變化?顯而易見,極大縮減了 客戶端 的編碼量,而且,一勞永逸,除非需求大改,不然這個框架,一次編寫,終身使用。除此之外,使用框架還可以極大地節省 客戶端 程式碼量,減少人為編碼時產生的可能疏漏(比如忘記釋放連線造成洩漏等). 試想一下,如果你是一個團隊 leader ,團隊成員的水平很有可能 參差不齊 ,那麼如何保證專案開發中 出錯機率最小 ------- 使用框架 , 用框架來簡化團隊成員的 編碼量 編碼難度 ,讓他們 傻瓜式 地寫程式碼.

三、Demo展示

總結

三個工作日收到了offer,頭條面試體驗還是很棒的,這次的頭條面試好像每面技術都問了我演算法,然後就是中介軟體、MySQL、Redis、Kafka、網路等等。

CodeChina開源專案:【一線大廠Java面試題解析+核心總結學習筆記+最新講解影片】

  • 第一個是演算法

關於演算法,我覺得最好的是刷題,作死的刷的,多做多練習,加上自己的理解,還是比較容易拿下的。

而且, 我貌似是將《演算法刷題LeetCode中文版》、《演算法的樂趣》大概都過了一遍,尤其是這本

《演算法刷題LeetCode中文版》總共有15個章節:程式設計技巧、線性表、字串、棧和佇列、樹、排序、查詢、暴力列舉法、廣度優先搜尋、深度優先搜尋、分治法、貪心法、動態規劃、圖、細節實現題

最新出爐,頭條三面技術四面HR,看我如何一步一步攻克面試官?

《演算法的樂趣》共有23個章節:

最新出爐,頭條三面技術四面HR,看我如何一步一步攻克面試官?

最新出爐,頭條三面技術四面HR,看我如何一步一步攻克面試官?

  • 第二個是Redis、MySQL、kafka(給大家看下我都有哪些複習筆記)

基本上都是面試真題解析、筆記和學習大綱圖,感覺複習也就需要這些吧(個人意見)

最新出爐,頭條三面技術四面HR,看我如何一步一步攻克面試官?

  • 第三個是網路(給大家看一本我之前得到的《JAVA核心知識整理》包括30個章節分類,這本283頁的JAVA核心知識整理還是很不錯的,一次性總結了30個分享的大知識點)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990490/viewspace-2792986/,如需轉載,請註明出處,否則將追究法律責任。

相關文章