- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试遵循 Android 最佳实践,因此在 Debug模式下我打开了以下所有内容:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all thread violations
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all virtual machine violations
当我尝试在主 (UI) 线程中使用任何类型的文件访问或 SQL 时,Android 现在会对我大喊大叫。但是我看到很多建议在主线程中使用文件访问和/或 SQL。例如,主 Activity 应在 onCreate()
中加载默认首选项值,以防它们尚未设置:
PreferenceManager.setDefaultValues(context, resId, readAgain);
糟糕 --- 这会导致在第一次执行应用程序时访问文件,因为在 UI 线程上调用了 onCreate()
。我能看到的唯一绕过它的方法是启动一个单独的线程——这会引入与其他 UI 代码的竞争条件,这些代码可能会读取首选项并期望已经设置默认值。
还可以考虑 DownloadManager 等服务。 (实际上,它有很多错误,在现实生活中毫无用处,但让我们假装它能工作一秒钟。)如果你排队下载,你会得到一个事件(在主线程上)告诉你下载已经完成。要实际获取有关该下载的信息(它只会为您提供下载 ID),您必须查询 DownloadManager --- 它涉及一个游标,如果您启用了严格的策略,则会给您一个错误。
那么到底是怎么回事——在主线程中访问游标可以吗?或者这是一件坏事,一半的 Android 开发团队和 Android 书籍作者忘记了这一点?
最佳答案
The only way around it I can see is to start a separate thread---which introduces a race condition with other UI code that might read the preferences and expect the default values to already be set.
然后使用 AsyncTask
,将 setDefaultValues()
调用放入 doInBackground()
和“可能读取首选项的其他 UI 代码” "在 onPostExecute()
中。
To actually get information about that download (it only gives you a download ID), you have to query the DownloadManager---which involves a cursor, giving you an error if you have a strict policy turned on.
因此在后台线程中查询DownloadManager
。
So what's the story---is it fine to access cursors in the main thread?
这取决于你对“好”的定义。
在 Android 1.x 和大多数 2.x 设备上,使用的文件系统是 YAFFS2,它基本上序列化所有进程中的所有磁盘访问。最终结果是,虽然您的代码在单独情况下可能表现出足够的性能,但由于后台发生的其他事情(例如,下载新电子邮件),它有时在生产中显得迟缓。
虽然这在 Android 3.x 及更高版本(他们切换到 ext4)中不是什么大问题,但毫无疑问,闪存 I/O 仍然相对较慢——它只是会更慢一些,这是可以预见的。
StrictMode
旨在指出可能出现迟缓的位置。由您决定哪些是良性的,哪些不是。在一个理想的世界里,你会把它们全部清理干净;在理想的世界里,我会有头发。
Or is it a bad thing, and half the Android development team and Android book authors forgot about that?
一直都是“坏事”。
我不能代表“一半的 Android 开发团队”。我推测,在早期,他们希望开发人员应用他们现有的开发专业知识来检测迟缓行为——这与任何其他平台中的性能问题没有太大区别。随着时间的推移,除了系统级更改(例如 YAFFS2->ext4)以减少这种情况外,他们还提供了更多模式来引导开发人员走上积极的道路(例如 Loader
框架)的一个问题。在某种程度上,他们正试图解决 Android 引入明显的性能相关挑战的问题,例如单线程 UI。
同样,我不能代表所有 Android 图书作者。在我的书的早期版本中,我当然没有关注性能问题,因为我关注的是 Android 特性和功能。随着时间的推移,我在这些方面增加了更多建议。我还贡献了与这些主题相关的开源代码。 2012 年,我将对我的书籍进行大量修订,并创建更多开源项目,以继续解决这些问题。从你的语气来看,我怀疑我(可能还有其他人)在你眼中在这方面完全失败了,当然欢迎你发表意见。
关于android - SQL 或一般文件访问是否适用于 Android 主 UI 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8319513/
情况我想使用 ui-date 在我的应用程序中设置/编辑日期。我使用最新稳定版本的 Angular、Angular-UI、JQuery-UI 等。 问题一旦使用日期选择器选择了日期,我的模型中的日期将
编辑: jQuery UI 可选择小部件内置了一个回调,stop,我需要知道如何以编程方式触发此事件。 (措辞不佳)我已将事件监听器附加到 jQuery UI Selectable Widget 。如
我正在尝试建立一个下一个JS与尾风用户界面提供的反应组件的网络应用程序。顺风用户界面是在幕后使用无头用户界面。。默认情况下,Next JS将构建服务器端组件,除非您在页面顶部添加“使用客户端”。不幸的
我正在尝试建立一个下一个JS与尾风用户界面提供的反应组件的网络应用程序。顺风用户界面是在幕后使用无头用户界面。。默认情况下,Next JS将构建服务器端组件,除非您在页面顶部添加“使用客户端”。不幸的
我正在尝试应用这个 SlickGrid 示例: http://mleibman.github.com/SlickGrid/examples/example4-model.html 到我自己的网络项目。
我想整理我的 Schemas为我的实体类生成,DTO 类位于 Springdoc ui . 我可以对 tags 进行排序和 operations通过以下配置 yml文件,但我的模式不是按排序顺序排列的
有谁知道阻止 ui-sref 重新加载状态的方法吗? 我无法通过“$stateChangeStart”事件执行此操作,因为 ui-sref 仅更改参数而不更改状态名称。 我的左边是书单,左边是书的详细
我正在 jquery ui 对话框中使用 jquery ui 自动完成小部件。当我输入搜索文本时,文本框缩进(ui-autocomplet-loading)但不显示任何建议。 var availabl
我正在尝试将 Kendo UI MVVM 框架与 Kendo UI 拖放机制结合使用;但我很难找到如何将数据从 draggable 对象中删除。 我的代码是这样的...... var viewMode
Kendo UI Web 和 Kendo UI Core 之间有什么区别 https://www.nuget.org/packages/KendoUIWeb http://www.nuget.org/
我正在尝试将 Kendo UI MVVM 框架与 Kendo UI 拖放机制结合使用;但是我很难找到如何从 draggable 对象中删除数据。 我的代码是这样的…… var viewModel =
使用 Angular JS - UI 路由器,我需要从我的父 View project.details 到我的 subview project.details.tasks 进行通信。我的 subvie
KendoUI 版本 2013.3.1119使用 Kendo MVVM 我有一个我构建的颜色选择器,它使用平面颜色选择器和使用调色板的颜色选择器。它们都可以正常运行,但平面颜色选择器的布局已关闭, s
我在非 UI 线程上,我需要创建并显示一个 SaveDialog。但是当我尝试显示它时:.ShowDialog() 我得到: "An unhandled exception of type 'Syst
我正在试验 jquery-ui 并查看和克隆一些示例。在一个示例(自动完成的组合框)中,我看到一个带有 ui-widget 类的 anchor (a) 元素,它与包含的 css 文件中的 .ui-wi
我需要返回一个 UI 列表,我用这个方法: getList(): Observable { return this.httpClient.get("/api/listui").pipe
我有 ui-grids在 angular-ui-tabs ,它们位于 ng-if 中以避免呈现问题。如果有更多数据并且网格进入滚动模式,则单击选项卡时数据会完全消失。我相信这是一个 ui-grids-
这似乎是一个通用的问题,与其他几个 React 开源框架相比,我真的很喜欢 Material ui 的可扩展性。 问题 “@material-ui/core”和“@material-ui/lab”中的
我有一个根页面(index.html),带有侧边栏(“菜单”)和主要内容 div(“主”),因此有两个 ui-view div - 一个称为“菜单”,一个称为“主”。 当主要内容区域有网站列表 (/s
有人在http://jsfiddle.net/hKYWr/上整理了一个很好的 fiddle 。关于使用 angular-ui 和 jqueryui sortable 来获得良好的可排序效果。 如何在两
我是一名优秀的程序员,十分优秀!