1

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

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

当某些偏好发生变化时,我的onSharedPreferenceChanged方法将通知感兴趣的组件有关事件。这些感兴趣的组件之一更新ListAdapter. 我收到一些异常,表明此列表适配器正在由不是 UI 线程的线程修改。

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

文档表明此方法是在 UI 线程上调用的

此回调将在您的主线程上运行。

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

更新:这是堆栈跟踪。除此以外,数组大小始终为 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)
4

1 回答 1

1

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

看到这个线程

于 2012-10-16T09:52:59.720 回答