2

ListFragment定期的に更新したいことがあります。更新プロセス自体は非常に複雑で、時間がかかる場合があります。そのため、前回の更新が完了してから 5 秒後に新しい更新を実行するスレッドを作成しました。次に、リスト内の位置を追跡しながら、リストを更新するハンドラーを作成します。

問題は、私のフラグメント間をすばやくスライドするViewPagerことで、競合状態を強制onDestroyView()できることです: ハンドラーが呼び出す前に呼び出される可能性があるgetListView()ため、次のエラーが発生します。

java.lang.IllegalStateException: コンテンツ ビューがまだ作成されていません

私の質問は、どうすればこの競合状態を防ぐことができますか? ビューがまだ存在するかどうかを確認する方法はありますか? updateThread残念ながら、以下のコードで が中断されたかどうかを確認するだけでは十分ではありません。

    public class MyFragment extends ListFragment {
        private Thread updateThread = null;

        public void startUpdate() {
            /* Kill old thread */
            if (updateThread != null) {
                updateThread.interrupt();
            }

            final Handler handler = new Handler();
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        // ... collect data in `adapter`

                        final ArrayAdapter<String[]> ada = adapter;

                        handler.post(new Runnable() {

                            @Override
                            public void run() {
                                if (ada != null) {
                                    // restore view position
                                    int index = getListView().getFirstVisiblePosition(); // CRASH here
                                    View v = getListView().getChildAt(0);
                                    int top = (v == null) ? 0 : v.getTop();

                                    setListAdapter(ada);
                                    ada.notifyDataSetChanged();
                                    getListView().setSelectionFromTop(index, top);
                                }
                            }
                        });

                        //... sleep for some second
                    }
                }
            };

            updateThread = new Thread(r);

            updateThread.start(); // start updating
        }


        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);

            if (isVisibleToUser) {
                startUpdate();
            } else {
                if (updateThread != null) {
                    updateThread.interrupt();
                }
            }

        }

    }
4

1 に答える 1

1

isAddedを使用して、フラグメントがアクティビティに接続されているかどうかを確認してください

于 2013-08-15T10:13:06.933 に答える