動態圖片演示,原始碼直析:手把手講解IPC框架,最新整理
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框架時
客戶端、服務端 的核心程式碼
客戶端
之前的
bindService
呢?沒了。客戶端使用此框架來進行 程式通訊,不用去關心AIDL
怎麼寫了,不用關注bindService,ServiceConnection
,省了很多事。
服務端
對比 使用框架前後,我們的核心程式碼的變化
有什麼變化?顯而易見,極大縮減了
客戶端
的編碼量,而且,一勞永逸,除非需求大改,不然這個框架,一次編寫,終身使用。除此之外,使用框架還可以極大地節省客戶端
程式碼量,減少人為編碼時產生的可能疏漏(比如忘記釋放連線造成洩漏等). 試想一下,如果你是一個團隊leader
,團隊成員的水平很有可能參差不齊
,那麼如何保證專案開發中出錯機率最小
-------使用框架
, 用框架來簡化團隊成員的編碼量
和編碼難度
,讓他們傻瓜式
地寫程式碼.
三、Demo展示
總結
三個工作日收到了offer,頭條面試體驗還是很棒的,這次的頭條面試好像每面技術都問了我演算法,然後就是中介軟體、MySQL、Redis、Kafka、網路等等。
-
第一個是演算法
關於演算法,我覺得最好的是刷題,作死的刷的,多做多練習,加上自己的理解,還是比較容易拿下的。
而且, 我貌似是將《演算法刷題LeetCode中文版》、《演算法的樂趣》大概都過了一遍,尤其是這本
《演算法刷題LeetCode中文版》總共有15個章節:程式設計技巧、線性表、字串、棧和佇列、樹、排序、查詢、暴力列舉法、廣度優先搜尋、深度優先搜尋、分治法、貪心法、動態規劃、圖、細節實現題
《演算法的樂趣》共有23個章節:
-
第二個是Redis、MySQL、kafka(給大家看下我都有哪些複習筆記)
基本上都是面試真題解析、筆記和學習大綱圖,感覺複習也就需要這些吧(個人意見)
-
第三個是網路(給大家看一本我之前得到的《JAVA核心知識整理》包括30個章節分類,這本283頁的JAVA核心知識整理還是很不錯的,一次性總結了30個分享的大知識點)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990490/viewspace-2792986/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 圖片載入框架Picasso - 原始碼分析框架原始碼
- 圖片載入框架Picasso原始碼分析框架原始碼
- 短視訊直播原始碼,動態釋出時選擇圖片、上傳圖片原始碼
- 用python實現植物大戰殭屍(遊戲截圖+動態演示+原始碼分享)Python遊戲原始碼
- 直播系統原始碼,圖片一直滾動,迴圈滾動,豎向和橫向原始碼
- PostgreSQL 原始碼解讀(248)- HTAB動態擴充套件圖解#2SQL原始碼套件圖解
- PostgreSQL 原始碼解讀(247)- HTAB動態擴充套件圖解#1SQL原始碼套件圖解
- 柱狀圖、直方圖、散點圖、餅圖講解直方圖
- DAPP代幣預售智慧合約系統模式講解(附原始碼演示示例)APP模式原始碼
- 最新php藍奏雲直鏈api介面原始碼PHPAPI原始碼
- Android圖片載入框架Picasso原始碼分析(基於Picasso 2.71828)Android框架原始碼
- RecyclerView動畫原始碼淺析View動畫原始碼
- android程式碼中動態調整圖片的位置Android
- Gson的原始碼講解原始碼
- JUC 原始碼講解:sleep()原始碼
- Dubbo原始碼淺析(一)—RPC框架與Dubbo原始碼RPC框架
- python實現超級瑪麗小遊戲(動圖演示+原始碼分享)Python遊戲原始碼
- flutter圖片元件原始碼解析Flutter元件原始碼
- UI設計流行框架、學習路線圖教程,最新意派基礎講解UI框架
- EventBus 3.0+ 原始碼詳解(史上最詳細圖文講解)原始碼
- debug:am trace-ipc原始碼分析原始碼
- 推薦一下swoole協程框架hyperf原始碼講析的影片[更新一下]框架原始碼
- 短視訊平臺原始碼,動態上傳的圖片以九宮格形式展示原始碼
- SparseArray詳解及原始碼簡析原始碼
- LinkedHashMap 詳解及原始碼簡析HashMap原始碼
- 移動端如何實現長按儲存圖片(圖片上的二維碼是動態的)?
- 動態代理及java演示Java
- 淺析MySQL 8.0直方圖原理MySql直方圖
- Slim 框架原始碼解讀框架原始碼
- 瀏覽器 Javascript 的 EventLoop 動態圖析瀏覽器JavaScriptOOP
- nest-article:號稱Javascript Spring Boot的NextJS框架演示原始碼JavaScriptSpring BootNextJS框架原始碼
- JUC原始碼講解:逐步解析 Thread.init() 原始碼原始碼thread
- Activity啟動模式(GIF 動態演示)模式
- 圖解原始碼 | SpringBoot中自動配置原理圖解原始碼Spring Boot
- GifCam,Gif動態圖片截圖小軟體
- 直播app系統原始碼,圖片Loading旋轉動畫效果APP原始碼動畫
- 手機直播原始碼,實現圖片瀑布流式滑動效果原始碼
- JavaScript動態設定元素背景圖片JavaScript