android - 在Android的MyApplication()中调用Configuration.Builder()时,作业计划程序和工作管理器发生冲突

标签 android syntax-error android-workmanager conflicting-libraries

因此,我声明了我的Worker类NotifyWorker,并在MainActivity中使用以下代码对其进行了调用:

import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.util.Log;

import com.birbit.android.jobqueue.JobManager;
import com.birbit.android.jobqueue.config.Configuration;
import com.birbit.android.jobqueue.log.CustomLogger;

public class MainActivity extends AppCompatActivity {

    //some code
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        if(checkForUpdate(this)){
            return;
        }
         //some code

        final OneTimeWorkRequest notificationWork = new OneTimeWorkRequest.Builder(NotifyWorker.class)
                .setInitialDelay(1, TimeUnit.MINUTES)
                .addTag(workTag)
                .build();


        //WorkManager.getInstance(getBaseContext()).beginUniqueWork(workTag, ExistingWorkPolicy.REPLACE, notificationWork);
        WorkManager.getInstance(getApplication()).enqueue(notificationWork);
        Log.v(TAG,"Worker executed");

        //Set content
        setContentView(R.layout.activity_main);
        //some code
}
}
因此,在运行该应用程序时出现以下错误:
 Caused by: java.lang.IllegalStateException: WorkManager is not initialized properly.  You have explicitly disabled WorkManagerInitializer in your manifest, have not manually called WorkManager#initialize at this point, and your Application does not implement Configuration.Provider.
因此,我遵循The developer documentation,将所需的代码添加到了 list 中,但是我无法在myApplication()类中添加以下方法:
class MyApplication extends Application implements Configuration.Provider {
    @Override
    public Configuration getWorkManagerConfiguration() {
        return Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.INFO)
                .build();
    }
}
我的应用程序类如下所示:
public class xxxApplication extends Application implements androidx.work.Configuration.Provider {
    private static xxxApplication instance;
    private JobManager jobManager;
    private BroadcastReceiver broadcastReceiver;
    public xxxApplication(){
        instance = this;
    }

    @Override
    public void onCreate(){
        super.onCreate();
        //ensure jobmanager is configured
        getJobManager();
        broadcastReceiver=new NetworkChangeReceiver();
        IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(broadcastReceiver, intentFilter);
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        unregisterReceiver(broadcastReceiver);
    }

    private void configureJobManager(){
        Configuration.Builder builder = new Configuration.Builder(this)
                .customLogger(new CustomLogger() {
                    private static final String TAG = "JOBS";
                    @Override
                    public boolean isDebugEnabled() {
                        return true;
                    }

                    @Override
                    public void d(String text, Object... args) {
                        Log.d(TAG, String.format(text, args));
                    }

                    @Override
                    public void e(Throwable t, String text, Object... args) {
                        Log.e(TAG, String.format(text, args), t);
                    }

                    @Override
                    public void e(String text, Object... args) {
                        Log.e(TAG, String.format(text, args));
                    }

                    @Override
                    public void v(String text, Object... args) {

                    }
                })
                .minConsumerCount(1)
                .maxConsumerCount(3)
                .loadFactor(3)
                .consumerKeepAlive(120);
        //configure here if job scheduler involved
        jobManager = new JobManager(builder.build());

    }
    public synchronized JobManager getJobManager() {
        if (jobManager == null) {
            configureJobManager();
        }
        return jobManager;
    }

    public static xxxApplication getInstance() {
        return instance;
    }

    @Override
    public **Configuration** getWorkManagerConfiguration() {   //I get some conflict here , resolved by using androidx.work.Configuration as a return type
        return  Configuration.Builder()    // Can't resolve the issue ?? what do i write here??
                    .setMinimumLoggingLevel(android.util.Log.INFO)
                    .build();

    }

}
我已经评论了我遇到问题的部分,语法错误显示为“预期方法调用”。我该如何解决这个问题?为什么它没有按预期工作? JobManager和WorkManager配置之间是否存在冲突?
更新:因此,jobmanager和workmanager的配置文件之间实际上存在冲突。必须使用完整的位置定义来调用后者。

最佳答案

我自己回答这个问题,以防它对以前使用Job-Schedulers并现在使用WorkManager添加后台进程的其他人有用。
在添加Developer documentation中指定的扩展名以进行自定义初始化时,如果您已经在应用程序类中使用JobScheduler,请使用以下代码:

public class xxxApplication extends Application implements androidx.work.Configuration.Provider {
//OTHER CODE
@Override
    public androidx.work.Configuration getWorkManagerConfiguration() {
        return new androidx.work.Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.INFO)
                .build();
    }
}
但是,建议您将所有流程迁移到WorkManager,以避免进一步的冲突。

关于android - 在Android的MyApplication()中调用Configuration.Builder()时,作业计划程序和工作管理器发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62992218/

相关文章:

android - 我不能动态地执行 getResources.getString 吗?

android - 无法执行子项,getpt 失败 : no suck file or directory

android - 无法在 WorkManager 的 Worker 类中注入(inject)单例类

android - 应用更新时 WorkManager 的队列会被清空吗?

android - 如何防止安卓的内购项目被破解

android - 如何在 iOS 和 android 中实现 YouTube LiveStream 播放器?

syntax - 我如何在 QBASIC 中修复这个关于 READ DATA 的语法错误

javascript - JSON 解析时抛出错误

java - 用抽象编译错误,并且不覆盖抽象方法

android - 可以在Worker中使用WebView吗?