当在 MyApplication() Android 中调用 Configuration.Builder() 时,Job Scheduler 和 Work manager 发生冲突
Job Scheduler and Work manager conflict when Configuration.Builder() called in MyApplication() Android
因此,我声明了我的 Worker Class 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 ,将所需的代码添加到我的清单中,但是我无法在 myApplication() [=44= 中添加以下方法] :
class MyApplication extends Application implements Configuration.Provider {
@Override
public Configuration getWorkManagerConfiguration() {
return Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.build();
}
}
我的申请 class 如下所示:
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 配置之间是否存在冲突?
UPDATE : 所以,实际上jobmanager和workmanager[=36的配置文件有冲突=]。必须使用完整的位置定义来调用后者。
我自己在回答这个问题,以防它对以前使用过 Job-Schedulers 并且现在正在使用 WorkManager[ 添加后台进程的其他人有用=20=]。
在为自定义初始化添加 Developer documentation 中指定的扩展时,如果您已经在应用程序 class 中使用了 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 以避免进一步的冲突。
因此,我声明了我的 Worker Class 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 ,将所需的代码添加到我的清单中,但是我无法在 myApplication() [=44= 中添加以下方法] :
class MyApplication extends Application implements Configuration.Provider {
@Override
public Configuration getWorkManagerConfiguration() {
return Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.build();
}
}
我的申请 class 如下所示:
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 配置之间是否存在冲突?
UPDATE : 所以,实际上jobmanager和workmanager[=36的配置文件有冲突=]。必须使用完整的位置定义来调用后者。
我自己在回答这个问题,以防它对以前使用过 Job-Schedulers 并且现在正在使用 WorkManager[ 添加后台进程的其他人有用=20=]。 在为自定义初始化添加 Developer documentation 中指定的扩展时,如果您已经在应用程序 class 中使用了 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 以避免进一步的冲突。