Android 是否始终在UI线程上调用onSharedPreferenceChanged

Android 是否始终在UI线程上调用onSharedPreferenceChanged,android,sharedpreferences,Android,Sharedpreferences,我有一个singleton类,它注册了一个首选项更改侦听器,如: PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()) .registerOnSharedPreferenceChangeListener( preferencesChangeListener); 当某些首选项更改时,myonSharedPreferenceChan

我有一个singleton类,它注册了一个首选项更改侦听器,如:

PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext())
            .registerOnSharedPreferenceChangeListener(
                    preferencesChangeListener);
当某些首选项更改时,my
onSharedPreferenceChanged
方法将通知感兴趣的组件一个事件。其中一个感兴趣的组件更新
列表适配器中的数据。我得到一些异常,表明此列表适配器正在被一个非UI线程的线程修改

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

文档表明此方法是有效的

此回调将在主线程上运行

有没有人见过情况并非如此的情况?在应用程序上下文中注册首选项更改侦听器是否重要

更新:这是堆栈跟踪。除此之外,数组大小始终为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上运行应用程序吗你是在Android上运行应用程序吗?你能发布这些异常之一的堆栈跟踪吗?我已经多次更改非ui线程的首选项,从来没有出现过问题。此外,我还编写了许多功能测试,这些测试修改了SharedReference,并且必须与UI线程同步,以便将更改传播到侦听器。所以我猜这不是共享参考。正如Ted Hopp所写,向我们展示stacktrace。你能为其中一个异常发布堆栈跟踪吗?我已经多次更改非ui线程的首选项,从来没有出现过问题。此外,我还编写了许多功能测试,这些测试修改了SharedReference,并且必须与UI线程同步,以便将更改传播到侦听器。所以我猜这不是共享参考。正如泰德·霍普(Ted Hopp)所写,让我们看看stacktrace。