随着Gingerbread的发布,我一直在尝试一些新的API,其中一个是StrictMode.
我注意到其中一个警告是为了getSharedPreferences().
这是警告:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
Run Code Online (Sandbox Code Playgroud)
并且它是为getSharedPreferences()在UI线程上进行的调用而给出的.
是否SharedPreferences真的应该从UI线程访问和更改?
我正在运行我的应用程序,在开发中激活StrictMode,如下所示StrictMode用于较低平台版本, 并注意到一条错误消息,我不知道该考虑什么,也无法找到任何参考.
我得到一个android.os.StrictMode$InstanceCountViolation与价值观instances和limit如
实例= 3; 极限= 2
现在我想知道:
有任何想法吗?
我在logcat中收到此消息 资源是在附加的堆栈跟踪中获取但从未发布的.有关避免资源泄漏的信息,请参阅java.io.Closeable.在哪里寻找泄漏,它是什么意思"看java.io.Closeable"
启用 StrictMode 后我注意到了这一点:
2021-05-08 11:09:42.854 14347-14773/com.myapp D/StrictMode: StrictMode policy violation: android.os.strictmode.LeakedClosableViolation: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks. Callsite: close
at android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1929)
at dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:305)
at sun.nio.fs.UnixDirectoryStream.finalize(UnixDirectoryStream.java:240)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:291)
at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:278)
at java.lang.Daemons$Daemon.run(Daemons.java:139)
at java.lang.Thread.run(Thread.java:923)
2021-05-08 11:09:42.855 14347-14773/com.myapp D/StrictMode: StrictMode policy violation: android.os.strictmode.LeakedClosableViolation: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks. Callsite: close
at android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1929)
at dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:305)
at …Run Code Online (Sandbox Code Playgroud) 我用我的Android 3.0应用程序遇到了NetworkOnMainThreadException.正在寻找解决方案我找到了这个,但如果我理解正确,默认设置将是关闭严格模式.
此外,我的所有网络访问都在一个AsyncTask,所以我无论如何也看不到这个例外中的重点.
所以,我现在非常绝望,我应该做些什么来阻止这个...
亲切的问候,水母
编辑:
这篇博客文章说AsyncTask应该足够了,但至少可以澄清StrictMode点.
解:
我关闭了StrictMode(它可能更好地保留一些设置,但我不能打扰......):
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Run Code Online (Sandbox Code Playgroud)
在那之后,我确实遇到了"java.lang.RuntimeException:这个线程禁止HTTP请求",但是在这里找到了解决方案.不过我有点困惑,因为AndroidHttpClient我在Android 2.0+应用程序中使用它时效果很好......
解决方案,第2部分
事实证明,使用AsyncTask是一个不错的主意但如果做错了就没用了 ......所以严格模式的反应没有任何问题.应该听,呃?;)
仍然很高兴知道它默认在Honeycomb上激活.
android android-asynctask android-3.0-honeycomb android-strictmode
我注意到自从FroYo(API 8)以来在Android API中引入了DropBoxManager.
它看起来像一个替代记录器,不仅能够记录文本,还能记录文件或字节数组,但我无法在任何地方找到任何有关如何以及何时使用它的详细文档.
在最新的Android开发博客文章介绍StrictMode谈论它,StrictMode可以将数据添加到Dropbox的,和我们得到一个shell命令来获取这些数据.
请在此分享您对此的了解!为什么除了通常的logcat之外还实现了它?我们可以使用它来跨应用程序共享数据吗?什么样的应用程序使用它?
我使用StrictMode来查找非SDK用法:
if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectNonSdkApiUsage()
.penaltyLog()
.build());
}
Run Code Online (Sandbox Code Playgroud)
现在,我违反了政策:
D/StrictMode: StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/view/textclassifier/logging/ SmartSelectionEventTracker$SelectionEvent;->selectionAction(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/ SmartSelectionEventTracker$SelectionEvent;
at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
at java.lang.Class.getDeclaredMethodInternal(Native Method)
at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
at java.lang.Class.getMethod(Class.java:2063)
at java.lang.Class.getMethod(Class.java:1690)
at bzi.a(SourceFile:11)
at bzq.a(SourceFile:12)
at org.chromium.content.browser.selection.SmartSelectionClient.<init>(SourceFile:5)
at bzZ.a(Unknown Source:7)
at org.chromium.android_webview.AwContents.e(SourceFile:193)
at org.chromium.android_webview.AwContents.d(SourceFile:153)
at org.chromium.android_webview.AwContents.<init>(SourceFile:81)
at uY.run(SourceFile:15)
at ahv.a(SourceFile:13)
at ahw.run(SourceFile:2)
at org.chromium.base.ThreadUtils.b(SourceFile:31)
at ahv.a(SourceFile:7)
at com.android.webview.chromium.WebViewChromiumFactoryProvider.b(SourceFile:6)
at com.android.webview.chromium.WebViewChromium.init(SourceFile:111)
at android.webkit.WebView.<init>(WebView.java:678)
at android.webkit.WebView.<init>(WebView.java:604)
at android.webkit.WebView.<init>(WebView.java:587)
at android.webkit.WebView.<init>(WebView.java:574)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at …Run Code Online (Sandbox Code Playgroud) 我不确定是否有其他人注意到它,但Gingerbread模拟器像狗一样运行,滚动,导航,互动 - 所有这些都需要更长的时间并且更加崎岖.当我尝试使用它时,我甚至在浏览器中得到了一个ANR:http://www.androidpolice.com/2010/12/06/walkthrough-and-hands-on-with-the-gingerbread-ui-the-new -gingerbread-keyboard-in-all-its-sexiness /(见底部).
我刚刚在http://android-developers.blogspot.com/2010/12/new-gingerbread-api-strictmode.html上了解了新的StrictMode 以及关于Gbread的所有性能改进,但到目前为止我的经验表明恰好相反.
我们可以深究这一点吗?我发现自己害怕在这一点上提出一个姜饼的例子.
performance android emulation android-sdk-2.3 android-strictmode
我已经开始使用Android StrictMode,并发现在开发期间始终运行它并不仅仅是我在git中创建的特殊分支上会很棒.我这样做的原因是我的应用程序要求以1.6及更高版本运行.
我在Android开发者博客上看到你可以设置它,以便通过反射激活它.我只是想知道它实际上是什么样的,如果有可能在这里(或其他地方)记录这些,而不是让所有想要使用它的人自己解决.
我已经在我的应用程序中启用了StrictMode,并且正如预期的那样导致一些崩溃.如何找到我的代码中的哪些内容违反了这些政策?
这是堆栈跟踪:
E/AndroidRuntime(19523): FATAL EXCEPTION: main
E/AndroidRuntime(19523): android.os.StrictMode$StrictModeViolation: policy=95 violation=2
E/AndroidRuntime(19523): at android.os.StrictMode.executeDeathPenalty(StrictMode.java:1326)
E/AndroidRuntime(19523): at android.os.StrictMode.access$1300(StrictMode.java:111)
E/AndroidRuntime(19523): at android.os.StrictMode$AndroidBlockGuardPolicy.handleViolation(StrictMode.java:1319)
E/AndroidRuntime(19523): at android.os.StrictMode$AndroidBlockGuardPolicy$1.run(StrictMode.java:1206)
E/AndroidRuntime(19523): at android.os.Handler.handleCallback(Handler.java:605)
E/AndroidRuntime(19523): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(19523): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(19523): at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime(19523): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(19523): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(19523): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
E/AndroidRuntime(19523): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
E/AndroidRuntime(19523): at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的......它不是很有用......我知道谁杀了我的应用程序,我需要知道为什么!
谢谢.