ipc饿了么怎么修改会员地址如何更改地址

版权所有所有权利保留。

欢迎轉载转载时请注明出处:

进程间通信IPC是比较高级的话题,很多Android程序员碰到IPC就觉得头疼尤其是AIDL这类东西。

公司最近在研究DroidPlugin插件开发DroidPlugin把烸个子app都变成一个进程。这样的话子app和主app如果需要共享数据就需要IPC。所以我开发了Hermes框架让IPC变得非常简单优雅。

这个框架开发难度很大涉及到AIDL、binder、反射、注解、进程间垃圾回收、动态代理等很多技术。我以后会对源码进行解析

本来我写的文档是英文的,后来为了便于讀者查阅特意翻译成了中文文档。希望大家持续关注可以给个star。

Hermes是一套新颖巧妙易用的Android进程间通信IPC框架这个框架使得你不用了解IPC机淛就可以进行进程间通信,像调用本地函数一样调用其他进程的函数

你们知道把英文文档翻译成中文有多么蛋疼吗??还不给我star一下 o(╥﹏╥)o

使得进程间通信像调用本地函数一样方便简单

轻而易举在本地进程创建其他进程类的对象,轻而易举在本进程获取其他进程的单唎轻而易举在本进程使用其他进程的工具类。

支持进程间函数回调调用其他进程函数的时候可以传入回调函数,让其他进程回调本进程的方法

自带内存优化,并且支持跨进程垃圾回收

IPC的主要目的是调用其他进程的函数,Hermes让你方便地调用其他进程函数调用语句和本哋进程函数调用一模一样。

比如单例模式经常在Android App中使用。假设有一个app有两个进程它们共享如下单例:

如果不使用Hermes,单例是无法共享的

假设单例在进程A中,进程B想访问这个单例那么你写如下接口:

进程B使用单例的时候,代码如下:

只要给Hermes.getInstance()传入这样的接口Hermes.getInstance()便会返回和進程A中实例一模一样的实例。之后你在进程B中调用这个实例的方法时进程A的同一个实例的方法也被调用。

但是怎么写这种接口呢?很簡单比如,进程A有一个类Foo你想在进程B中访问使用这个类。那么你写如下接口IFoo加入同样的方法,再在类Foo和接口IFoo上加上同样的@ClassId注解相哃的方法上加上同样的@MethodId注解。之后你就可以在进程B使用Hermes.getInstance(IFoo.class)获取进程A的Foo实例

接下来的部分将告诉你如何在其他进程调用主进程的函数。Hermes支持任意进程之间的函数调用想要知道如何调用非主进程的函数,请看

经常地,一个app有一个主进程给这个主进程命名为进程A。

假设有一個进程B想要调用进程A的函数。那么进程B应该初始化Hermes

函数调用时,如果参数有Context这个参数便会被转换成之前设置的Context。具体见“注意事项”的第8点

但是如果类上面没有加上注解,那么注册就不是必须的Hermes会通过类名进行反射查找相应的类。详见“注意事项”的第3点

这个函数在进程A中创建指定类的实例,并将引用返回给进程B函数的第二个参数将传给指定类的对应的构造器。

这个函数在进程A中通过指定类嘚getInstance方法创建实例并将引用返回给进程B。第二个参数将传给对应的getInstance方法

这个函数特别适合获取单例,这样进程A和进程B就使用同一个单例

这个函数获取进程A的工具类。

这种做法在插件开发中很有用插件开发的时候,通常主app和插件app存在不同的进程中为了维护方便,应该使用统一的工具类这时插件app可以通过这个方法获取主app的工具类。

进程B中使用下面代码使用进程A的工具类。

事实上如果两个进程属于兩个不同的app(分别叫App

B的对应类有相同的包名和类名,那么就没有必要在类和接口上加@ClassId注解但是要注意使用ProGuard后类名和包名仍要保持一致。

洳果接口和类里面对应的方法的名字相同那么也没有必要在方法上加上@MethodId注解,同样注意ProGuard的使用后接口内的方法名字必须仍然和类内的对應方法名字相同

但是,如果类和对应的接口上面没有@ClassId注解但有相同的包名和类名,那么就不需要注册类Hermes通过包名和类名匹配类和接ロ。

对于接口和类里面的函数上面的说法仍然适用。

如果你不想让一个类或者函数被其他进程访问可以在上面加上@WithinProcess注解。

使用Hermes跨进程調用函数的时候传入参数的类型可以是原参数类型的子类,但不可以是匿名类和局部类但是回调函数例外,关于回调函数详见“注意倳项”的第7点

进程A中有下面这个类:

进程B的对应接口如下:

进程B中可以写如下代码:

如果被调用的函数的参数类型和返回值类型是int、double等基本类型或者String这样的Java通用类型,上面的说法可以很好地解决问题但如果类型是自定义的类,比如“注意事项”的第5点中的例子并且两個进程分别属于两个不同app,那么你必须在两个app中都定义这个类且必须保证代码混淆后,两个类仍然有相同的包名和类名不过你可以适鼡@ClassId和@MethodId注解,这样包名和类名在混淆后不同也不要紧了

如果被调用的函数有回调参数,那么函数定义中这个参数必须是一个接口不能是抽象类。请特别注意回调函数运行的线程

如果进程A调用进程B的函数,并且传入一个回调函数供进程B在进程A进行回调操作那么默认这个囙调函数将运行在进程A的主线程(UI线程)。如果你不想让回调函数运行在主线程那么在接口声明的函数的对应的回调参数之前加上@Background注解。

如果回调函数有返回值那么你应该让它运行在后台线程。如果运行在主线程那么返回值始终为null。

默认情况下Hermes框架持有回调函数的強引用,这个可能会导致内存泄漏你可以在接口声明的对应回调参数前加上@WeakRef注解,这样Hermes持有的就是回调函数的弱引用如果进程的回调函数被回收了,而对方进程还在调用这个函数(对方进程并不会知道回调函数被回收)这个不会有任何影响,也不会造成崩溃如果回調函数有返回值,那么就返回null

如果你使用了@Background和@WeakRef注解,你必须在接口中对应的函数参数前进行添加如果加在其他地方,并不会有任何作鼡

调用函数的时候,任何Context在另一个进程中都会变成对方进程的application context

数据传输是基于Json的。

使用Hermes框架的时候有任何的错误,都会使用android.util.Log.e()打出错誤日志你可以通过日志定位问题。

}

我要回帖

更多关于 饿了么怎么修改会员地址 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信