SEO实战技术培训
一鸣叫兽SEO培训-国内知名企业SEO专家、专注SEO实战培训教学、全程一对一独立辅导。
文章27240 建站 浏览5057489

什么是ipc设备怎么用(通俗易懂科普处理器IPC性能含义)

原文标题:(什么是ipc设备怎么用(通俗易懂科普处理器IPC性能含义))

一、概念质量保证和预备技能

问:何时将使用多进程通信?答:常见的多进程应用一般是大公司的应用群,如腾讯的QQ微信的QQ空和QQ邮箱等。登录QQ邮箱时,可以直接拨打QQ的登录服务。此外,腾讯阿里还有小程序,由第三方开发,在微信客户上运行。如果他们运行在与微信相同的过程中,微信也将在崩溃时完成。显然,这是小应用程序开发者的大锅饭,腾讯不得不执行它们。这是不合适的。然而,小型公司emmmmm很少使用多流程开发,更不用说沟通了。然而,如果一个人不忍心进入一个大工厂,他就不能学习先进的技能。学点东西总比什么都不知道好。

问:使用多个流程有什么好处?答:1)进程隔离、子应用程序崩溃不会影响其他进程。2)在系统运行期间,每个进程的内存分区都有一个上限。具体数量取决于具体设备。使用多进程开发可以提高程序的可执行内存限制。3)如果系统运行期间内存紧张,可以停止子流程以降低系统压力。终止进程的方式通常比优化单个应用程序的内存更直接、更有效

问:什么是RPC?答:通过参数传递从客户端调用服务器上的函数,并获取返回的结果,隐藏底层的通信细节。就用法而言,远程函数像本地函数一样被调用。

问:我们自己定义一个RPC进程间通信框架的实际用途是什么?答:定义框架的功能是将脏活、累活和其他人不想重复的工作放入框架中,以便用户能够以最干净的方式使用业务界面。定义一个RPC进程间通信框架可以将C/S两端令人厌恶的人的AIDL代码集中到框架模块中,这是最直观的好处。此外,客户端最初需要手动绑定服务,定义服务连接,获取绑定器,然后进行通信,并使用RPC框架。所有这些内容都可以放入框架模块中。C/S两端的代码只是S端的服务注册和C端的RPC接口调用。代码看起来非常简洁(也许这里的文本描述不够直观,后面还有一个数字)

预备技能

为了理解本文的核心代码,我们仍然需要一些基础知识,大致如下:服务使用方法、安卓AIDL通信机制、java注释、java反射、java泛型

二。

见GitHub:https://github.com/18598925736/MyRpcFramework,运行aidl_client和aidl_service

首先展示了的原始效果

手把手讲解IPC框架(1) 图中的查找用户是从服务器读取的数据。看看核心代码:

这是我优化的IPC项目结构(如果没有优化,那么客户端和服务器端需要编写相同的AIDL代码,并拥有一个包名相同的JavaBean,这真的很难看):

手把手讲解IPC框架(1) 服务器核心代码:

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); } }

很容易发现服务器端的代码量是公平的,不是很复杂,但是在客户端,要处理连接,需要手动解除绑定和解除绑定服务,所有参与通信的javabean也必须意识到序列化接口parcelableDemo中只有一个客户端,这并不明显。但是,如果有n个客户端活动需要与服务通信,这意味着每个活动必须编写类似的代码。它既笨重又丑陋。

前方高能量

当不使用RPC框架时,CS两端的代码结构给人留下了大致的印象。以下是使用IPC框架时客户端和服务器的核心代码/s2/]

客户

手把手讲解IPC框架(1) 之前的绑定服务怎么样?不。客户端使用这个框架与流程进行通信,而不用担心AIDL是如何编写的,也不用担心绑定服务或服务连接,这样可以节省很多东西。

服务器

手把手讲解IPC框架(1) 比较使用框架前后我们核心代码的变化

发生了什么变化?显然,客户机的编码量大大减少了,一劳永逸地说,除非需求发生很大变化,否则这个框架将被编写一次并终身使用。此外,使用该框架还可以大大节省客户端代码的数量,并减少可能的遗漏(例如,由于忘记释放连接而导致的泄漏)。想象一下,如果你是一个团队领导,而团队成员的水平很可能不均衡,那么如何确保项目开发中出错的可能性最小——使用这个框架来简化团队成员的编码量和编码难度,让他们愚蠢地编写代码。

三。演示展示

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

手把手讲解IPC框架(1)对于 ,模拟场景是:服务器:打开登录服务,启动服务后保存登录用户名和密码客户端1 : RPC调用登录服务,用户名和密码与服务器相同,登录可以成功客户端2 : RPC调用登录服务,用户名和密码与服务器不同,并且

演示工程代码结构

手把手讲解IPC框架(1) 手把手讲解IPC框架(1) 手把手讲解IPC框架(1)

客户端和服务端必须同时依赖框架层module implementation project(":ipc") 注意: 客户端和服务器都必须依赖框架层模块实现项目(":ipc & quot)[/s2/]


原文标题:(什么是ipc设备怎么用(通俗易懂科普处理器IPC性能含义)) TAG:

最后编辑于: 2019-10-10 11:10:24作者:SEO实战培训

一鸣叫兽-让你成为一个能熟练运用SEO核心技能的SEO技术人才!

  • 作者相关
  • 免费领取SEO教程,名额有限,先到先得!QQ:912037469
上一篇:成语一劳永逸是什么意思怎么解释(巧辩“一蹴而就”与“一劳永逸”)
下一篇:it是什么职业怎么样工资一般多少(三分钟让你了解什么是IT行业)
评论(条)

验证码:
'); })();