2013-01-21 22 views
2

我設置了嚴格模式,然後我設置了Bugsense處理程序。這導致StrictMode策略違規。在AsyncTask上設置Bugsense處理程序導致嚴格模式衝突

有什麼合理的解釋爲什麼會發生?我怎樣才能擺脫它?

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) 

回答

2

你得到這個錯誤,因爲插件讀取從主線程SharedPreferences信息。

不幸的是,目前沒有辦法克服這一點,除了降低嚴格模式的政策。

我們正在研究此問題,即將發佈的下一個版本的BugSense插件將在嚴格模式下運行良好。

感謝您的反饋,這是非常有價值的,如果您有任何其他問題,我會很樂意在我們的支持論壇上回答它!

+0

我希望你儘快修復,因爲它應該是微不足道的解決:) – pixel

-2

我有類似的問題。我爲我的應用程序創建了DEVELOPER_MODE。這只是布爾標誌,告訴應用程序是否處於開發人員模式。我只在開發者模式下啓用strictmode,沒有理由爲已發佈的應用啓用strictmode。另一方面,我禁用開發人員模式的bugsense,因爲如果我在LogCat中看到它們,則不需要bug報告。 我的代碼看起來像這樣

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(); 
    } 
} 
+0

如果您禁用嚴格模式,這並不意味着該問題不存在:) – pixel

+0

但您無權修復它在bugsense處理程序 – vandzi

0

你有與BugSense SDK(3.2)的新版本試過嗎?他們有固定的嚴格模式問題。

查看更改日誌here

+0

我知道他們修復它 - 這就是爲什麼我直接報告並通過這個問題;) – pixel