Skip to content

跨模块服务调用

xiaojinzi123 edited this page Oct 12, 2019 · 2 revisions

解释

服务发现其实就是 接口+实现类 的方式,接口对外公开,实现类隐藏,实现类一般在某一个业务模块中,相比 CC 组件化, CC 虽然更好的隐藏了所有的实现细节,但是调用不够直观和难以寻找.所以我更喜欢公开暴露接口,通过接口返回此接口的对象(实际上是一个实现类),然后调用,这种方式就是隐藏了实现类,但是保证了调用都是很明显和直观的

定义服务接口

当你想提供业务组件1的功能出去的时候,你在基础库(BaseModule)的service包下面新建一个接口文件,这个接口会被所有的业务模块引用到

image.png

public interface Component1Service {
    Fragment getFragment();
    void xxx();
    int count();
    ......
}

注册服务到服务容器

非单例服务

@ServiceAnno(value = {Component1Service.class},singleTon = false)
public class Component1ServiceImpl implements Component1Service {

    private Context context;

    public Component1ServiceImpl(@NonNull Application app) {
        context = app;
        Toast.makeText(app, "创建了 Component1Service 服务", Toast.LENGTH_SHORT).show();
    }

    @Override
    public Fragment getFragment() {
        return new Component1Fragment();
    }


}

单例服务

@ServiceAnno(value = {Component1Service.class},singleTon = true)
public class Component1ServiceImpl implements Component1Service {

    private Context context;

    public Component1ServiceImpl(@NonNull Application app) {
        context = app;
        Toast.makeText(app, "创建了 Component1Service 服务", Toast.LENGTH_SHORT).show();
    }

    @Override
    public Fragment getFragment() {
        return new Component1Fragment();
    }


}

服务的使用

然后其他任何一个地方就可以这样子使用啦

XXXService service = ServiceManager.get(XXXService.class);
// 然后你可以调用接口中的方法了

或者使用增强版本的 RxServiceManager,可以省去如果服务未找到等情况的判断,并且当你接口中返回的是 RxJava 中的五种Observable,那么其中发射出来的错误你可以不必处理,会自动被忽略,除非你拿到方法返回的Observable还自行使用了其他操作符,这时候请你处理错误的回调

RxServiceManager.with(Component1Service.class)
                .flatMap(new Function<Component1Service, SingleSource<String>>() {
                    @Override
                    public SingleSource<String> apply(Component1Service service) throws Exception {
                        return service.testError();
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Toast.makeText(TestServiceAct.this, "完成服务的调用啦,内容是:" + s, Toast.LENGTH_SHORT).show();
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Toast.makeText(TestServiceAct.this, "可以不用处理的错误,错误信息:" + Utils.getRealThrowable(throwable), Toast.LENGTH_SHORT).show();
                    }
                });
You can’t perform that action at this time.