yigit / android-priority-jobqueue

A Job Queue specifically written for Android to easily schedule jobs (tasks) that run in the background, improving UX and application stability.
3.4k stars 395 forks source link

StrictMode violation #314

Open maturecheese opened 7 years ago

maturecheese commented 7 years ago

I am getting a StrictModeDiskReadViolation and a StrictModeDiskWriteViolation warning even without running any jobs, seemingly by just instantiating JobManager.

I put this in onCreate() of Application StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() .penaltyDeath() .build());

...and the app crashes immediately with this:

D/StrictMode: StrictMode policy violation; ~duration=51 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=95 violation=2 at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1137) at libcore.io.BlockGuardOs.access(BlockGuardOs.java:67) at java.io.File.doAccess(File.java:283) at java.io.File.exists(File.java:363) at android.app.ContextImpl.getDir(ContextImpl.java:2668) at android.content.ContextWrapper.getDir(ContextWrapper.java:271) at com.birbit.android.jobqueue.persistentQueue.sqlite.FileStorage.(FileStorage.java:26) at com.birbit.android.jobqueue.persistentQueue.sqlite.SqliteJobQueue.(SqliteJobQueue.java:45) at com.birbit.android.jobqueue.DefaultQueueFactory.createPersistentQueue(DefaultQueueFactory.java:27) at com.birbit.android.jobqueue.JobManagerThread.(JobManagerThread.java:87) at com.birbit.android.jobqueue.JobManager.(JobManager.java:62) at com.example.marklloyd.voxrecdev.dagger2_injection.modules.AppModule.jobManager(AppModule.java:106) at com.example.marklloyd.voxrecdev.dagger2_injection.modules.AppModule_JobManagerFactory.get(AppModule_JobManagerFactory.java:23) at com.example.marklloyd.voxrecdev.dagger2_injection.modules.AppModule_JobManagerFactory.get(AppModule_JobManagerFactory.java:8) at dagger.internal.DoubleCheck.get(DoubleCheck.java:47) at com.example.marklloyd.voxrecdev.global.App_MembersInjector.injectMembers(App_MembersInjector.java:45) at com.example.marklloyd.voxrecdev.global.App_MembersInjector.injectMembers(App_MembersInjector.java:9) at com.example.marklloyd.voxrecdev.dagger2_injection.components.DaggerAppComponent.inject(DaggerAppComponent.java:384) at com.example.marklloyd.voxrecdev.global.App.onCreate(App.java:89) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1020) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5010) at android.app.ActivityThread.access$1600(ActivityThread.java:172) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1482) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5835) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

My JobManager is created like so :

@Provides @AppScope public JobManager jobManager() { Configuration config = new Configuration.Builder(app) .consumerKeepAlive(45) .maxConsumerCount(3) .minConsumerCount(1) .customLogger(new CustomLogger() { @Override public boolean isDebugEnabled() { return true; }

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

                    //Timber.d(text, args);
                }

                @Override
                public void e(Throwable t, String text, Object... args) {

                    Timber.e(t, text, args);
                }

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

                    Timber.e(text,args);
                }

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

                    //Timber.v(text, args);
                }
            })
            .injector(new DependencyInjector() {
                @Override
                public void inject(Job job) {
                    if (job instanceof BaseJob) {
                        ((BaseJob) job).inject(app.getAppComponent());
                    }
                }
            })
            .build();
    return new JobManager(config);
}

Can this shed any light on why this is happening? I greatly appreciate any help you can offer. Thanks.

yigit commented 7 years ago

looks like job manager is being initialized on the main thread. You can work around it by not initializing it on the main thread but it is better to solve it in the library so i'm marking this as a bug. Thanks.

maturecheese commented 7 years ago

many thanks for your response - I shall apply the workaround. Your library has really helped me.