我已经设置了Strict模式,然后我设置了Bugsense处理程序。这导致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)
答案 0 :(得分:2)
您收到此错误,因为插件从主线程中的SharedPreferences读取信息。
不幸的是,除了降低严格模式的政策外,目前无法克服这个问题。
我们正在努力解决这个问题,即将发布的BugSense插件的下一个版本将在严格模式下运行良好。
感谢您的反馈意见,这非常有价值,如果您有任何其他问题,我将很乐意在我们的支持论坛上回答!
答案 1 :(得分:0)
您是否尝试过新版本的BugSense SDK(3.2)?他们修复了严格模式问题。
检查更改日志here。
答案 2 :(得分:-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();
}
}