gpt4 book ai didi

android - onSharedPreferenceChanged 是否总是在 UI 线程上调用

转载 作者:行者123 更新时间:2023-11-30 04:11:57 29 4
gpt4 key购买 nike

我有一个单例类,它注册了一个偏好更改监听器,例如:

PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext())
.registerOnSharedPreferenceChangeListener(
preferencesChangeListener);

当某些首选项发生更改时,我的 onSharedPreferenceChanged 方法将通知感兴趣的组件有关事件。其中一个感兴趣的组件更新 ListAdapter 中的数据。我收到一些异常,表明此列表适配器正在被非 UI 线程的线程修改。

我检查了更改适配器数据的代码路径,没有发现任何错误。我唯一的怀疑是偏好更改监听器中的 onSharedPreferenceChanged 没有在 UI 线程上被调用。

文档表明此方法是 called on the UI thread

This callback will be run on your main thread.

有没有人见过不是这种情况的情况?我在应用程序上下文中注册了我的首选项更改监听器是否重要?

更新:这是堆栈跟踪。除此异常(exception),数组大小始终为 0。这就是我查看共享首选项监听器的原因,因为这是我清除适配器中数据的唯一代码路径。索引不为零,说明之前有数据。

> java.lang.IndexOutOfBoundsException: Invalid index 51, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
at java.util.ArrayList.get(ArrayList.java:311)
at com.palta.earthquake.EarthquakeAdapter.getItem(EarthquakeAdapter.java:56)
at com.palta.earthquake.EarthquakeAdapter.getView(EarthquakeAdapter.java:86)
at android.widget.AbsListView.obtainView(AbsListView.java:1294)
at android.widget.ListView.makeAndAddView(ListView.java:1727)
at android.widget.ListView.fillUp(ListView.java:682)
at android.widget.ListView.fillGap(ListView.java:628)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:2944)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2065)
at android.widget.ListView.onTouchEvent(ListView.java:3315)
at android.view.View.dispatchTouchEvent(View.java:3765)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:905)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
at android.app.Activity.dispatchTouchEvent(Activity.java:2093)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4914)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

最佳答案

您是在 Android <=2.2 上运行该应用程序吗?如果是,commit() 实现在 2.3 中发生了变化,因此它始终在主线程中执行(因此 onSharedPreferenceChanged() 也是如此),但在 2.2 中不是。

参见 this thread .

关于android - onSharedPreferenceChanged 是否总是在 UI 线程上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726397/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com