当前位置: 首页 > 面试题库 >

是否应该通过UI线程访问SharedPreferences?

喻昀
2023-03-14
问题内容

随着Gingerbread的发布,我一直在尝试一些新的API,其中之一是StrictMode

我注意到警告之一是针对getSharedPreferences()

这是警告:

StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2

并给出getSharedPreferences()了在UI线程上进行的调用。

是否应该SharedPreferences真正从UI线程进行访问和更改?


问题答案:

很高兴您已经在玩它!

注意事项:( 以懒惰的子弹形式)

如果这是您遇到的最严重的问题,则您的应用程序可能是个不错的选择。:)写操作通常比读操作慢,因此请确保使用的是SharedPreferenced $ Editor.apply()而不是commit()。apply()是GB和异步的新功能(但始终安全,请小心生命周期转换)。您可以使用反射来有条件地调用GB +上的apply()以及Froyo或更低版本上的commit()。我将在博客文章中提供有关如何执行此操作的示例代码。
关于载入,不过…

加载后,SharedPreferences为单例并在整个进程范围内缓存。因此您希望尽早加载它,以便在需要它之前将其存储在内存中。(假设它很小,如果使用的是SharedPreferences,它应该是一个简单的XML文件,应该是这样。)您不想在以后的某个用户单击按钮时对其进行故障处理。

但是每当调用context.getSharedPreferences(…)时,都会对后台XML文件进行统计以查看其是否已更改,因此无论如何在UI事件期间都应避免这些统计信息。统计信息通常应该是快速的(并经常被缓存),但是yaffs并发性不高(并且许多Android设备都在yaffs上运行… Droid,Nexus One等),因此,如果避免使用磁盘,您可以避免陷入其他正在进行的或待处理的磁盘操作。

因此,您可能需要在onCreate()期间加载SharedPreferences并重新使用同一实例,从而避免使用stat。

但是如果在onCreate()期间仍然不需要使用偏好,则加载时间会不必要地拖延应用程序的启动,因此通常最好使用诸如FutureTask 子类之类的东西来启动.set的新线程。 ()FutureTask子类的值。然后,只需在需要时查找FutureTask 的成员并对其进行.get()。我计划透明地在Honeycomb的幕后使之免费。我将尝试发布一些示例代码,以显示该领域的最佳实践。



 类似资料:
  • 我正在编写一个WPF表单应用程序,在其中我试图循环通过一个文件夹并实时显示其文件,使用异步等待方法。在我的任务中。运行()方法我正在引发我的事件,这会引发罚款,但是事件代码也会更新UI线程上的文本框,因此我UI线程错误 '调用线程无法访问此对象,因为另一个线程拥有它。' .有什么方法可以更改我的代码,以便我可以更新我的TextBox? 和我的事件处理程序代码

  • 我正在使用MVC模式开发一个WinForms应用程序。我是否应该从控制器访问UI组件,例如treeview节点? 我想访问一个treeview选择的节点并改变它的标记之类的东西,我应该从controller访问它还是违反MVC的原则? 唯一让我恼火的是treenode属于名称空间,并且从MVC透视图/表单相关组件应该只在视图中使用,所以我才问。

  • 问题内容: 我知道没有线程可以访问当前视图,除非它是UI线程。我想知道为什么?哪个线程更改视图为什么很重要?是出于安全原因吗?这是我使用的解决方法: 每当我想更改布局时,这样做都是一种痛苦。是否有其他解决方法?我了解异步任务,但从未找到一种使用它的好方法,它比我正在做的更好吗?所有相关的答案都适用! 问题答案: 是的,您的权利:为了安全起见,您不能在另一个线程上修改视图(这就是为什么将其称为UI线

  • 在Android上有没有办法知道,如果运行我的代码的线程,是UI线程还是不是?在swing中,有来告诉我是否在UI线程上。安卓SDK里有什么功能让我知道这一点吗?

  • 任何关于直接远程访问(不使用ssh->kubectl代理来避免在Kubernetes节点上进行用户管理)的详细实用指南都将不胜感激。:) 更新: 只是想说清楚点。这是在前提部署中的裸机(没有GCE、AWZ、Azure或任何其他),而且有些环境将完全脱机(这将增加获得安装包的额外问题)。 因此,当我在Kubernetes上设置入口时,我无法创建将443重定向到6443的防火墙规则。似乎唯一的选择是创

  • 方法有一个有趣的属性,它将允许其他线程在被阻止时进入其同步块。例如(假设线程1首先运行): 线程1: 线程2: 线程 2 能够唤醒线程 1 的事实意味着线程 2 进入了同步块,即使其他某个线程位于同一对象的同步块中也是如此。这对我来说很好,但我想知道这是否只发生在或所有会使线程“等待”的方法()上。在我的情况下,我关心,因为如果行为与相同,它会破坏我的代码: 那么,多个线程是否可能因为join调用