次のような設定変更リスナーを登録するシングルトン クラスがあります。
PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext())
.registerOnSharedPreferenceChangeListener(
preferencesChangeListener);
特定の設定が変更されると、私のonSharedPreferenceChanged
メソッドは、関心のあるコンポーネントにイベントについて通知します。これらの関心のあるコンポーネントの 1 つは、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)