android开发分享应该访问SharedPreferencesclosuresUI线程?

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

我注意到其中的一个警告是getSharedPreferences()

这是警告:

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

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

SharedPreferences访问和更改是否真的应该由UI线程完成?

    我很高兴你已经在玩它了!

    有些事情要注意:( 以懒惰的子弹forms)

    关于加载,虽然…

    查看Android Developers博客,了解即将到来的与StrictMode相关主题的即将发布的post。

    访问共享首选项可能需要一段时间,因为它们是从闪存中读取的。 你读了很多吗? 也许你可以使用不同的格式,例如SQLite数据库。

    但不要修复使用StrictMode发现的所有内容。 或者引用文档:

    但是不要强迫所有StrictMode发现。 特别是,在正常的活动生命周期中,通常需要很多磁盘访问的情况。 使用StrictMode来查找你意外做的事情。 但是,UI线程上的networking请求几乎总是一个问题。

    一个关于Brad答案的微妙之处是:即使你在onCreate()中加载SharedPreferences,你仍然应该读取后台线程中的值,因为getString()等阻塞,直到读完共享文件首选项(在后台线程上):

     public String getString(String key, String defValue) { synchronized (this) { awaitLoadedLocked(); String v = (String)mMap.get(key); return v != null ? v : defValue; } } 

    编辑()也以相同的方式阻止,尽pipeapply()在前台线程中看起来是安全的。

    (不好意思把这个放在这里,我会把这个作为对Brad答案的一个评论,但是我刚join,没有足够的声望去这样做。)

    我知道这是一个老问题,但我想分享我的方法。 我有很长的阅读时间,并使用了共享偏好和全局应用程序类的组合:

    ApplicationClass:

     public class ApplicationClass extends Application { private LocalPreference.Filter filter; public LocalPreference.Filter getFilter() { return filter; } public void setFilter(LocalPreference.Filter filter) { this.filter = filter; } } 

    LocalPreference:

     public class LocalPreference { public static void saveLocalPreferences(Activity activity, int maxDistance, int minAge, int maxAge, boolean showMale, boolean showFemale) { Filter filter = new Filter(); filter.setMaxDistance(maxDistance); filter.setMinAge(minAge); filter.setMaxAge(maxAge); filter.setShowMale(showMale); filter.setShowFemale(showFemale); BabysitApplication babysitApplication = (BabysitApplication) activity.getApplication(); babysitApplication.setFilter(filter); SecurePreferences securePreferences = new SecurePreferences(activity.getApplicationContext()); securePreferences.edit().putInt(Preference.FILER_MAX_DISTANCE.toString(), maxDistance).apply(); securePreferences.edit().putInt(Preference.FILER_MIN_AGE.toString(), minAge).apply(); securePreferences.edit().putInt(Preference.FILER_MAX_AGE.toString(), maxAge).apply(); securePreferences.edit().putBoolean(Preference.FILER_SHOW_MALE.toString(), showMale).apply(); securePreferences.edit().putBoolean(Preference.FILER_SHOW_FEMALE.toString(), showFemale).apply(); } public static Filter getLocalPreferences(Activity activity) { BabysitApplication babysitApplication = (BabysitApplication) activity.getApplication(); Filter applicationFilter = babysitApplication.getFilter(); if (applicationFilter != null) { return applicationFilter; } else { Filter filter = new Filter(); SecurePreferences securePreferences = new SecurePreferences(activity.getApplicationContext()); filter.setMaxDistance(securePreferences.getInt(Preference.FILER_MAX_DISTANCE.toString(), 20)); filter.setMinAge(securePreferences.getInt(Preference.FILER_MIN_AGE.toString(), 15)); filter.setMaxAge(securePreferences.getInt(Preference.FILER_MAX_AGE.toString(), 50)); filter.setShowMale(securePreferences.getBoolean(Preference.FILER_SHOW_MALE.toString(), true)); filter.setShowFemale(securePreferences.getBoolean(Preference.FILER_SHOW_FEMALE.toString(), true)); babysitApplication.setFilter(filter); return filter; } } public static class Filter { private int maxDistance; private int minAge; private int maxAge; private boolean showMale; private boolean showFemale; public int getMaxDistance() { return maxDistance; } public void setMaxDistance(int maxDistance) { this.maxDistance = maxDistance; } public int getMinAge() { return minAge; } public void setMinAge(int minAge) { this.minAge = minAge; } public int getMaxAge() { return maxAge; } public void setMaxAge(int maxAge) { this.maxAge = maxAge; } public boolean isShowMale() { return showMale; } public void setShowMale(boolean showMale) { this.showMale = showMale; } public boolean isShowFemale() { return showFemale; } public void setShowFemale(boolean showFemale) { this.showFemale = showFemale; } } } 

    MainActivity(在您的应用程序中首先被调用的活动):

     LocalPreference.getLocalPreferences(this); 

    步骤解释:

    注:总是检查一个应用程序的广泛variables是否与NULL不同,原因 – >

    应用程序对象不会永远留在内存中,它会被杀死。 与stream行的观点相反,应用程序不会从头开始重新启动。 Android将创build一个新的Application对象,并启动用户以前的活动,以使幻想中的应用程序从未被杀死。

    如果我没有检查null,我将允许在filter对象上调用示例getMaxDistance()时抛出一个空指针(如果应用程序对象是由Android从内存中移出的)

      以上就是android开发分享应该访问SharedPreferencesclosuresUI线程?相关内容,想了解更多android开发(异常处理)及android游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/addevelopment/516608.html

      (0)
      上一篇 2020年12月3日 下午2:50
      下一篇 2020年12月3日

      精彩推荐