Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WorkManager in Android 3——RxJava以及IoC集成 #219

Open
soapgu opened this issue Aug 11, 2023 · 0 comments
Open

WorkManager in Android 3——RxJava以及IoC集成 #219

soapgu opened this issue Aug 11, 2023 · 0 comments
Labels

Comments

@soapgu
Copy link
Owner

soapgu commented Aug 11, 2023

  • 前言

WorkManager in Android 2——高级用法中有两个问题没有得到解决

  • 怎么解决RxJava框架结合问题,至少快速入门的Worker和RxJava八字不合,难道我还要把RxJava拆成同步方法?
  • 怎么解决依赖注入,Worker并不属于Android的组件,Hilt框架似乎没有入口点。另外Worker也是一个相对封闭的类,运行过程也属于托管运行,没有办法过程中干预或者传入复杂依赖,似乎陷入困境了

接下来是展现技术的时候了
图片

  • RxWork

好在本身框架提供了RxJava的插件

  • RxWorker 是为 RxJava 用户建议的实现。如果您有很多现有异步代码是用 RxJava 建模的,则应使用 RxWorker。与所有 RxJava 概念一样,您可以自由选择所需的线程处理策略。请参阅 RxWorker 中的线程处理,详细了解 RxWorker 实例中的线程处理。

依赖需要填写

implementation "androidx.work:work-rxjava3:$work_version"

public class TokenUpdateWork extends RxWorker{
    /**
     * @param appContext   The application {@link Context}
     * @param workerParams Parameters to setup the internal state of this worker
     */
    public TokenUpdateWork(@NonNull Context appContext, @NonNull WorkerParameters workerParams) {
        super(appContext, workerParams);
    }

    @NonNull
    @Override
    public Single<Result> createWork() {
        OAuthProvider provider
        return adapter.getDeviceToken()
                .map(tokenMap -> {
                    provider.updateToken( tokenMap.get(Config.ACCESS_TOKEN) );
                    Logger.i("Get Token ok :) result:%s", provider.getToken());
                    return Result.success();
                })
                .onErrorReturn( throwable -> {
                    Logger.e("TokenUpdateWork error",throwable);
                    return Result.failure();
                } );
    }
}

只要实现Single createWork()就行。

参考链接

接下来要解决最后一个问题了,依赖怎么拿?

  • 看上去很美好的HiltWorker

看了一下Hilt的官方文档,似乎Work不在Component范围内
图片

问了ChatGPT,提出要用HiltWorker。
一下子看到了希望。
不过这个HiltWorker有点令人失望

  • 实现代价不小

从StackOverflow来看
Injecting CoroutineWorker using Hilt

  1. 增加依赖androidx.hilt:hilt-work:1.0.0,这个到不是主要问题
  2. AndroidManifest.xml里面移除默认的Work初始化
  3. 需要在Application注入HiltWorkerFactory和WorkManagerConfiguration

收益也不高,Only dependencies available in the SingletonComponent can be injected into the Worker.只有全局对象能注入。

  • 使用entry point

好在Hilt有个@entrypoint是专门给那些未支持Hilt注入的类而准备的!
当然这种方式主要是用来全局单例注入

  1. 定义部分

首先签入一个接口注入到SingletonComponent,需要用@entrypoint注解

public class TokenUpdateWork extends RxWorker{
    //其他代码..

    @EntryPoint
    @InstallIn(SingletonComponent.class)
    public interface OAuthInterface {
        IOauthApiAdapter getAdapter();
        OAuthProvider getProvider();
    }
}

2.调用部分

    @NonNull
    @Override
    public Single<Result> createWork() {
        OAuthInterface oAuthInterface = EntryPoints.get( this.getApplicationContext(), OAuthInterface.class );
        OAuthProvider provider = oAuthInterface.getProvider();
        //其他代码..
    }

只要使用EntryPoints.get就行了,非常方便,HiltWorker可以果断抛弃了

终于在项目中正式使用了,至少周期性任务和解耦的方式还是不错

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant