首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

SharedPreferences是Android平台上用于存储轻量级数据的一种机制。它是基于键值对的形式存储数据,并且可以跨多个Activity和Fragment进行共享访问。在Android开发中,UI线程负责处理用户界面的绘制和交互,而SharedPreferences的读写操作是属于I/O操作,可能会涉及到磁盘读写,因此不推荐在UI线程中直接访问SharedPreferences。

在UI线程中进行SharedPreferences的读写操作可能会导致界面卡顿或者ANR(Application Not Responding)的问题,因为磁盘I/O操作是相对耗时的。为了避免这种情况,可以将SharedPreferences的读写操作放在后台线程中进行,例如使用AsyncTask、Handler、Thread等方式进行异步操作。

推荐的做法是,在需要访问SharedPreferences的地方,可以创建一个后台线程或者使用线程池来执行读写操作,然后通过回调或者消息机制将结果传递给UI线程进行更新。这样可以保证UI线程的流畅性和响应性。

腾讯云提供了一系列的云计算产品,其中包括存储服务、数据库服务、人工智能服务等。在与SharedPreferences相关的场景中,可以考虑使用腾讯云的对象存储(COS)服务来存储大量的数据文件,或者使用腾讯云的云数据库(TencentDB)来存储结构化数据。具体的产品介绍和使用方法可以参考腾讯云官方文档:

总结:不推荐在UI线程中直接访问SharedPreferences,可以通过后台线程进行读写操作,腾讯云提供了对象存储和云数据库等相关产品来满足存储需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

win10 uwp 非ui线程访问 ui

大家都知道,不可以在 其他线程访问 UI 线程访问 UI 线程包括给 依赖属性设置值、读取依赖属性、调用方法(如果方法里面修改了依赖属性)等。...一旦访问UI线程,那么就会报错,为了解决这个问题,需要使用本文的方法,让后台线程访问 UI 线程。...本文提供三个方法可以让其他线程访问 UI 线程 第一个方法是比较不推荐使用的,可能出现 win10 uwp Window.Current.Dispatcher中Current为null...High ,参见 CoreDispatcherPriority 那么比较推荐的一个方法是在一个用户控件或者Page之类的,如果在里面使用了异步线程需要访问 ui 的属性,那么可以使用下面代码 await...Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { //UI code here

1.1K10

win10 uwp 非ui线程访问 ui

大家都知道,不可以在 其他线程访问 UI 线程访问 UI 线程包括给 依赖属性设置值、读取依赖属性、调用方法(如果方法里面修改了依赖属性)等。...一旦访问UI线程,那么就会报错,为了解决这个问题,需要使用本文的方法,让后台线程访问 UI 线程。...本文提供三个方法可以让其他线程访问 UI 线程 第一个方法是比较不推荐使用的,可能出现 win10 uwp Window.Current.Dispatcher中Current为null...High ,参见 CoreDispatcherPriority 那么比较推荐的一个方法是在一个用户控件或者Page之类的,如果在里面使用了异步线程需要访问 ui 的属性,那么可以使用下面代码 await...Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { //UI code here

54440
  • WPF 应用启动过程同时启动多个 UI 线程访问 ContentPresenter 可能让多个 UI 线程互等

    在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 UI 线程互等。...然后在主 UI 线程执行 App 时,同时启动另一个 UI 线程,让另一个 UI 线程碰到 ContentPresenter 类型。...如上代码将需要创建 ContentPresenter 对象 在 App.xaml.cs 里,在 App 构造函数再启动另一个 UI 线程,在新 UI 线程里面访问 ContentPresenter 类型的...执行在新 UI 线程的 ContentPresenter 的静态构造函数在等待主 UI 线程释放锁才能执行完成。主 UI 线程在等待新 UI 线程的静态构造函数执行完成。...由于碰到了类型里面的某个属性,无论是否静态,都会先调用对应的类型的静态构造函数,静态构造函数只会被调用一次,因此即可解决线程安全问题 另一个解决方法是不要尝试在应用启动的过程里面开启多个 UI 线程

    65210

    让源码告诉你:Android 不要滥用 SharedPreferences(上)

    UI 线程操作 SharedPreferences 数据,可能导致 UI 线程等待。...如果加载过程较为耗时,此时我们在 UI 线程中对 SharedPreferences 做相关数据操作,该线程就会进入 wait 状态。...这里也需要注意每次通过 SharedPreferences.edit() 都会创建一个新的 EditorImpl 对象,应该尽量批量操作统一提交。最后会一起总结出。...分析到这里关于 SharedPreferences 数据提交过程:commit 发生在当前线程,apply 发生在工作线程,如果要保证 I/O 操作不阻塞 UI 线程我们可以优先考虑使用 apply 来提交修改...5、commit 提交发生在 UI 线程,apply 提交发生在工作线程,对于数据的提交最好是批量操作统一提交。

    1.3K20

    SharedPreferences采用什么方式存储数据_sharedpreferences使用方法

    Context对象的getSharedPreferences()方法可以获取一个SharedPreferences对象,之后我们就可以通过SharedPreferences来管理我们的键值对数据了。...SharedPreferences数据存储示例 如果我们想要通过SharedPreferences存储数据,代码如下: SharedPreferences.Editor editor =...sp是在新建线程执行初始化工作,如果App启动时,在主线程执行大量的sp初始化工作,会创建大量的线程,且线程优先级同UI线程,这样会造成sp线程抢占UI线程资源,造成启动过慢等问题。...sp如果是在优先级较低子线程中执行sp的初始化工作,则sp加载过程可能会变的很长。 sp在提交时,如果在ui线程中使用commit同步提交,则可能会导致因等待而产生的ANR问题。...sp文件数量也要进行控制,以减少线程数量和内存使用。 ui线程中使用sp数据要注意时效性,最好在使用之前,预加载到内存。

    1.6K20

    SharedPreferences VS MMKV

    不可访问的;MODE_APPEND 也为应用私有,但是新保存的数据放置在文件最后,不会替换之前已有的 key-value;MODE_WORLD_READABLE/WRITEABLE 为其他文件是否可以支持读写操作...,若未读取完成 awaitLoadedLocked() 会被阻塞,此时在 UI线程中进行使用时就可有可能会造成 ANR; @Override public void apply() { final...,无法获取提交的结果;commit 是同步更新,使用时会阻塞主线程,因为是同步提交,可以获取 Boolean 状态的提交状态,进而判断是否提交成功; 4....跨进程状态同步; SharedPreferences 为了线程安全不支持跨进程状态同步;MMKV 通过 CRC 校验 和文件锁 flock 实现跨进程状态更新; d....因为线程安全不支持在多进程中进行数据更新;而 MMKV 通过 flock 文件锁和 CRC 校验支持多进程的读写操作; 和尚简单理解,MMKV 在进程 A 中更新了数据,在进程 B 中获取当前数据时会先通过

    50081

    SharedPreferences VS MMKV

    时,通过 cache 来防止同一个 SharedPreferences 被重复创建; TAG 03: SharedPreferencesImapl 为具体的实现类,初始化时开启新的 I/O 线程读取整个文件...,若未读取完成 awaitLoadedLocked() 会被阻塞,此时在 UI线程中进行使用时就可有可能会造成 ANR; @Override public void apply() { final...,无法获取提交的结果;commit 是同步更新,使用时会阻塞主线程,因为是同步提交,可以获取 Boolean 状态的提交状态,进而判断是否提交成功; 4....跨进程状态同步;       SharedPreferences 为了线程安全不支持跨进程状态同步;MMKV 通过 CRC 校验 和文件锁 flock 实现跨进程状态更新; d....因为线程安全不支持在多进程中进行数据更新;而 MMKV 通过 flock 文件锁和 CRC 校验支持多进程的读写操作;       小菜简单理解,MMKV 在进程 A 中更新了数据,在进程 B 中获取当前数据时会先通过

    95161

    使用 Jetpack DataStore 进行数据存储

    SharedPreferences 有一个看上去可以在 UI 线程安全调用的同步 API,但是该 API 实际上执行了磁盘 I/O 操作。...此外,apply() 方法会在 fsync() 阻塞 UI 线程。在您应用的任何地方,每当 Service 或 Activity 启动或停止时,就会触发等待 fsync() 的调用。...由 apply() 安排的 fsync() 调用过程会阻塞 UI 线程,这也常常成为造成 ANR 的源头。** SharedPreferences 在分析出错时会抛出运行时异常。...DataStore 可以确保在 Dispatchers.IO 上检索数据,因此不会阻塞您的 UI 线程。...} ) ) 总结 SharedPreferences 有着许多缺陷: 看起来可以在 UI 线程安全调用的同步 API 其实并不安全、没有提示错误的机制、缺少事务 API 等等。

    1.1K10

    使用 Jetpack DataStore 进行数据存储

    SharedPreferences 有一个看上去可以在 UI 线程安全调用的同步 API,但是该 API 实际上执行了磁盘 I/O 操作。...此外,apply() 方法会在 fsync() 阻塞 UI 线程。在您应用的任何地方,每当 Service 或 Activity 启动或停止时,就会触发等待 fsync() 的调用。...由 apply() 安排的 fsync() 调用过程会阻塞 UI 线程,这也常常成为造成 ANR 的源头。 SharedPreferences 在分析出错时会抛出运行时异常。...DataStore 可以确保在 Dispatchers.IO 上检索数据,因此不会阻塞您的 UI 线程。...} ) ) 总结 SharedPreferences 有着许多缺陷: 看起来可以在 UI 线程安全调用的同步 API 其实并不安全、没有提示错误的机制、缺少事务 API 等等。

    81220

    Flutter 3.7 新特性:介绍后台isolate通道

    社区多年来一直致力于使用插件来访问代码(非 Dart 实现),例如 path_provider 找到临时目录的能力或 flutter_local_notifications 发布通知的能力。...或者某个应用可能正在进行大量计算,而开发人员不希望这些计算影响 UI。 在我帮助谷歌其他团队使用 Flutter 的过程中,随着产品的演进,最终会不可避免地遇到 root isolate 瓶颈。...SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); print(sharedPreferences.getBool...(‘isDebug’)); } 技术细节 下面是平台通道工作原理概述: 当平台通道被调用产生结果时将通过硬编码转到 platform 线程。...为了保证后台 isolate 正常运行,发送消息的 isolate 应该被持有,以便引擎可以在该 isolate 的事件循环上调度结果,这是通过Dart’s ports来实现的,Dart ports 存储并持有

    4.2K40

    【专业技术】Android数据保存之SharedPreferences

    前言: 程序中处理的大部分问题都与数据有关,读取数据显示在UI上,读取的数据可以是本地的,也可以是网络的。保存用户数据到存储空间,可以是本地的数据库,文件等,也可以是保存到网络服务器。...key-value键值集合保存数据: 如果你有一些相对较少的键值数据集需要保存,那么SharedPreferences应该能够满足你。...每一个SharedPreferences文件都被Android framework管理,可以是只能创建它的应用程序访问,也可以分享给其他应用程序。怎么用SharedPreferences保存数据呢?...: 1、getSharedPreferences(String name, int mode) 此方通通过Context对象调用,返回一个唯一的SharedPreferences对象,这里的唯一指的是通过...; 读取数据从Shared Preferences文件: 从Shared Preferences文件读取之前保存的数据比较简单,通过SharedPreferences对象的getXX方法就能完成,代码如下

    1.4K70

    【Android】期末选择题和判断题

    7 关于Service和Thread的区别说法,不正确的是( C) A、当有耗时或阻塞的操作时应该在其中创建一个线程。 B、可以在Service里创建一个Thread。...通过getInputStream()方法获取返回结果输入流,并用Java流的操作方式处理返回结果 应该是connection.setRequestMethod(“GET”);//设置请求方式 40 应用升级时...A、外部存储上的文件 B、SharedPreferences C、SQLite数据库 D、系统存储上的文件 1 Android的UI也是线程安全的。...我的答案:√ 17 BroadcastReceiver与Service一样,可以通过线程来解决一些较为耗时的操作。...我的答案:√ 19 一般而言,Android中想要更新应用程序里的UI元素,则必须在主线程中进行,否则就会出现异常 我的答案:√ 20 要想在子线程中来更新相应的UI控件,可用Android提供的同步消息处理机制来解决

    1.4K51

    Android:CoolWeather天气查看器

    酷欧天气至少应该具备以下功能: 1. 可以罗列出全国所有的省、市、县。 2. 可以查看全国任意城市的天气信息。 3. 可以自由地切换城市,去查看其他城市的天气。 4....sharedPreferences = getSharedPreferences("name", Activity.MODE_PRIVATE); Editor editor = sharedPreferences.edit...然后当子线程中需要进行UI 操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。...由于Handler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行UI操作了。.../ */ } @Override protected Boolean doInBackground(Void... arg0) { /* * 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任

    1.1K20

    Android之SharedPreferences使用

    获取SharedPreferences对象有下面两个方式: getSharedPreferences(String name, int mode) 通过Context调用该方法获得对象。...:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件; getPreferences(int mode) 通过Activity调用获得对象。...在主线程调用它应该多注意,因为可能引起阻塞,引起ANR。 commit有返回值,返回是否成功写入永久性存储种。apply没有返回值。 性能问题 跨进程不安全。...SharedPreferences 文件的加载使用了异步线程,而且加载线程并没有设置优先级,如果这个时候读取数据就需要等待文件加载线程的结束。...所以当应用收到系统广播,或者被调用 onPause 等一些时机,系统会强制把所有的 SharedPreferences 对象的数据落地到磁盘。如果没有落地完成,这时候主线程会被一直阻塞。

    1.1K20

    说一说SharedPreferences中的线程同步和加载时机

    线程问题 SharedPreferences线程同步的,这点在SharedPreferencesImpl下对应的get、put等函数中都可以看到,第一步就是请求同步锁,如: @Override public...mModified.put(key, value); return this; } } commit和apply 老生常谈了,commit会立刻写入内存和文件,所以有返回值,是否成功...因为可以减少io操作,比如同时大量的修改,apply会先将修改封装并放入一个队列,然后通过handler发送一个消息,如果消息执行,则将队列中的事件处理。...因为handler的消息并不一定及时执行,比如前面消息很多,或者ui操作比较多,所以会延迟集中处理,这样也节省了系统资源。...sp.startReloadIfChangedUnexpectedly(); } return sp; } 可以看到,执行这个函数后,就先在cache中判断是否存在,如果不存在才会取读取文件

    10610
    领券