Java编程从入门到实践,动态图片演示,源码直析

		@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框架时` 客户端、服务端 的核心代码**

##### **客户端**

![](https://img-blog.csdnimg.cn/img_convert/ee0a34a04583c0917b7dd1eb334cf1f4.png)

> 之前的 `bindService`呢?没了。客户端使用此框架来进行 进程通信,不用去关心 `AIDL`怎么写了,不用关注 `bindService,ServiceConnection`,省了很多事。

##### **服务端**

![](https://img-blog.csdnimg.cn/img_convert/3f11f52a31a82c70c7def6b6572c21e4.png)

##### **对比 使用框架前后,我们的核心代码的变化**

> **有什么变化?显而易见,极大缩减了 `客户端`的编码量,而且,一劳永逸,除非需求大改,不然这个框架,一次编写,终身使用。除此之外,使用框架还可以极大地节省 `客户端`代码量,减少人为编码时产生的可能疏漏(比如忘记释放连接造成泄漏等). 试想一下,如果你是一个团队 `leader`,团队成员的水平很有可能 `参差不齐`,那么如何保证项目开发中 `出错概率最小` ------- `使用框架`, 用框架来简化团队成员的 `编码量`和 `编码难度`,让他们 `傻瓜式`地写代码.**

## **三、Demo展示**

**github地址**:https://github.com/18598925736/MyRpc

![](https://img-blog.csdnimg.cn/img_convert/2f112eba2d29611b153781380c32e70c.gif)

> 以上Demo,模拟的场景是:
> 
> **服务端**:开启一个 `登录服务`,启动服务之后,保存一个 `可以登录`的用户名和密码
> 
> **客户端1**:`RPC`调用 `登录服务`,用户名和密码 和服务端的 `一样`,可以登录成功
> 
> **客户端2**:`RPC`调用 `登录服务`,用户名和密码 和服务端的 `不一样`,登录失败

##### `Demo`**工程代码结构图**

![](https://img-blog.csdnimg.cn/img_convert/0262dd9a814a3c8289918f7ae01a3067.png)
![](https://img-blog.csdnimg.cn/img_convert/11e44f7064203426f77a7a2d72e88e77.png)
![](https://img-blog.csdnimg.cn/img_convert/66e513b113453ca65610cf89b505c7f2.png)

**注**:**客户端和服务端必须同时依赖框架层module** **`implementation project(":ipc")`**

(未完待续......)


# **学习分享,共勉**

这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,**囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!**

> **资料都是免费提供的,整理不易,有需要的朋友可以转发分享下,同时可以关注我,定期分享学习资源还会更新一些技术分享!**

**[资料免费领取:点击这里即可免费获取!](https://gitee.com/vip204888/java-p7)**

**整理不易,有需要的朋友转发支持下,感谢感谢!**

**Java核心知识体系笔记.pdf**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/1c2829bb4fa84c1ef8a491819b0cbae5.png)

**中高级Java开发面试高频考点题笔记300道.pdf**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/56448f56233178ca7d21ed882241abf3.png)

**架构进阶面试专题及架构学习笔记脑图**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/8bb586e7340b8150568aae912dbbcbb9.png)

**Java架构进阶学习视频分享**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/f070c132982b4d1ca8a5523fc821203c.png)



[外链图片转存中...(img-I8dsKt9k-1628289483323)]

**架构进阶面试专题及架构学习笔记脑图**

[外链图片转存中...(img-4QvkSFDx-1628289483323)]

**Java架构进阶学习视频分享**

[外链图片转存中...(img-0ljHRIr9-1628289483324)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值