Установка обработчика ошибок в AsyncTask приводит к нарушению строгого режима

Я настроил строгий режим, а затем настроил обработчик ошибок. Это привело к нарушению политики StrictMode.

Есть ли логическое объяснение, почему это происходит? Как я могу избавиться от этого?

MyApplication.java:

    android.os.StrictMode.ThreadPolicy.Builder threadPolicyBuilder = new android.os.StrictMode.ThreadPolicy.Builder();
    android.os.StrictMode.VmPolicy.Builder vmPolicyBuilder = new android.os.StrictMode.VmPolicy.Builder();
    android.os.StrictMode.setThreadPolicy(threadPolicyBuilder.detectAll().penaltyLog().build());
    android.os.StrictMode.setVmPolicy(vmPolicyBuilder.detectAll().penaltyLog().build());

    new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {

                BugSenseHandler.initAndStartSession(MyApplication.this, "my-id");

            return null;
        }
    }.execute();

Stacktace:

01-21 09:43:40.889: D/StrictMode(29660): StrictMode policy violation: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
01-21 09:43:40.889: D/StrictMode(29660):    at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745)
01-21 09:43:40.889: D/StrictMode(29660):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:228)
01-21 09:43:40.889: D/StrictMode(29660):    at java.io.FileInputStream.<init>(FileInputStream.java:80)
01-21 09:43:40.889: D/StrictMode(29660):    at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:381)
01-21 09:43:40.889: D/StrictMode(29660):    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
01-21 09:43:40.889: D/StrictMode(29660):    at com.bugsense.trace.BugSenseHandler.initAndStartSession(Unknown Source)
01-21 09:43:40.889: D/StrictMode(29660):    at com.bugsense.trace.BugSenseHandler.initAndStartSession(Unknown Source)
01-21 09:43:40.889: D/StrictMode(29660):    at my.app$1.doInBackground(MyApplication.java:52)
01-21 09:43:40.889: D/StrictMode(29660):    at my.app$1.doInBackground(MyApplication.java:1)
01-21 09:43:40.889: D/StrictMode(29660):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-21 09:43:40.889: D/StrictMode(29660):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
01-21 09:43:40.889: D/StrictMode(29660):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-21 09:43:40.889: D/StrictMode(29660):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-21 09:43:40.889: D/StrictMode(29660):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-21 09:43:40.889: D/StrictMode(29660):    at java.lang.Thread.run(Thread.java:1019)

3 ответа

Решение

Вы получаете эту ошибку, потому что плагин читает информацию из SharedPreferences в главном потоке.

К сожалению, на данный момент нет способа преодолеть это, кроме понижения политики строгого режима.

Мы работаем над этим, и следующая версия плагина BugSense, которая скоро будет выпущена, будет отлично работать в строгом режиме.

Спасибо за ваш отзыв, это очень ценно, если у вас есть другие вопросы, я буду рад ответить на них на наших форумах поддержки!

Вы пробовали с новым выпуском BugSense SDK (3.2)? Они исправили проблемы в строгом режиме.

Проверьте список изменений здесь.

У меня была похожая проблема. Я создал DEVELOPER_MODE для своего приложения. Это просто логический флаг, который сообщает приложению, нахожусь ли я в режиме разработчика. Я включаю строгий режим только в режиме разработчика, поэтому нет необходимости включать строгий режим для опубликованного приложения. С другой стороны, я отключаю bugsense для режима разработчика, потому что мне не нужен отчет об ошибках, если я вижу их в LogCat. Мой код выглядит так

public static final boolean DEVELOPER_MODE = true;


@Override
public void onCreate() {

    if (DEVELOPER_MODE) {
    StrictMode.setThreadPolicy(new  StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());
    StrictMode.setVmPolicy(new  StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());

    }else{
        new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {

                BugSenseHandler.initAndStartSession(MyApplication.this, "my-id");

            return null;
            }
        }.execute();
    }
}
Другие вопросы по тегам