Android: Workmanager Dagger (вы пытались инициализировать его вручную, не отключая WorkManagerInitializer) - PullRequest
0 голосов
/ 17 апреля 2020

Несколько дней go Я работаю над внедрением Dagger в сочетании / инъекции с Android Workmanager. В основном это работает отлично, однако я получаю сообщение об ошибке при открытии приложения (приложение активно в фоновом режиме).

WorkManager уже инициализирован. Вы пытались инициализировать его вручную, не отключая WorkManagerInitializer? См. WorkManager # initialize (Context, Configuration) или уровень класса Javado c для получения дополнительной информации.

Вы сталкивались с этой проблемой раньше, и как я могу ее исправить? Ниже приведены некоторые снимки кода моего приложения.

Файл манифеста :

<provider
            android:name="androidx.work.impl.WorkManagerInitializer"
            android:authorities="{packagename}.workmanager-init"
            android:exported="false"
            android:enabled="false"
            tools:node="remove" />

WorkerBindingModule :

@Module
public interface WorkerBindingModule {

    @Binds
    @IntoMap
    @WorkerKey(VVSArtikelWorker.class)
    GithubWorkerFactory bindVVSArtikelWorker(VVSArtikelWorker.Factory factory);

    @Binds
    @IntoMap
    @WorkerKey(ArticleInventoryWorker.class)
    GithubWorkerFactory bindArticleInventoryWorker(ArticleInventoryWorker.Factory factory);
}

WorkerKey :

@MapKey
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface WorkerKey {

    Class<? extends ListenableWorker> value();
}

AppComponent :

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        ActivityBuildersModule.class,
        ViewModelFactoryModule.class,
        RoomModule.class,
        NetworkModule.class,
        WorkerBindingModule.class
})
public interface AppComponent extends AndroidInjector<XVSApplication> {

    UserSessionManager userSessionManager();
    XVSWorkerFactory appGithubWorkerFactory();

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);

        AppComponent build();

    }
}

XVSApplication :

public class XVSApplication extends DaggerApplication {

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(this).build();
    }
}

BaseActivity :

public class BaseActivity extends DaggerAppCompatActivity {

    private static final String TAG = "BaseActivity";

    @Inject
    public UserSessionManager userSessionManager;

    @Inject
    XVSWorkerFactory factory;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        subscribeObservers();
        configurationBuilderWorkManager();
        setupPeriodicWork();
    }
.....
    private void setupPeriodicWork() {
//        Constraints constraints = new Constraints.Builder().setRequiresBatteryNotLow(true).setRequiredNetworkType(NetworkType.CONNECTED).build();
        PeriodicWorkRequest periodicWorkRequestVVSArticle = new PeriodicWorkRequest.Builder(VVSArtikelWorker.class, 12, TimeUnit.HOURS).build();
        WorkManager.getInstance(this).enqueue(periodicWorkRequestVVSArticle);

        PeriodicWorkRequest periodicWorkRequestArticleOrder = new PeriodicWorkRequest.Builder(ArticleInventoryWorker.class, 1, TimeUnit.HOURS)
                .build();
        WorkManager.getInstance(this).enqueue(periodicWorkRequestArticleOrder);
    }

  private void configurationBuilderWorkManager() {
        Configuration config = new Configuration.Builder()
                .setWorkerFactory(factory)
                .build();

        WorkManager.initialize(this, config);
    }

1 Ответ

0 голосов
/ 17 апреля 2020

Из документации для WorkManager.initialize():

Этот метод вызывает исключение, если он вызывается несколько раз.

В то время как каждый экземпляр из BaseActivity вызывает только onCreate() один раз, вы не можете ожидать, что будет только один экземпляр BaseActivity в течение жизни Application. В частности, это неизбежно, если пользователь запускает ваше приложение, завершает работу, нажимая кнопку «Назад», а затем снова запускает ваше приложение. Второй экземпляр также попытается инициализировать WorkManager в onCreate(), что вызывает исключение.

В той же документации предлагается лучшее место для инициализации WorkManager:

  • Вызовите этот метод в Application#onCreate или ContentProvider. Обратите внимание, что этот метод должен вызываться в одном из этих двух мест, иначе вы рискуете получить NullPointerException в getInstance(Context).
...