2013-08-15 3 views
1

У меня есть ListFragment, который я хочу обновить регулярно. Сам процесс обновления довольно сложный и может занять некоторое время. Вот почему я создал поток, который выполняет новое обновление через 5 секунд после того, как было выполнено предыдущее обновление. Затем я создаю обработчик для обновления списка, сохраняя при этом отслеживание позиции в списке.ListFragment: предотвратить состояние гонки между getListView() и onDestroyView()

Проблема заключается в том, что путем быстрого скольжения между фрагментами в моей ViewPager я могу заставить состояние гонки: onDestroyView() может быть вызван до обработчика вызовов getListView(), что приводит к следующей ошибке:

java.lang.IllegalStateException: Content view not yet created

Мой вопрос: как я могу предотвратить это состояние гонки? Есть ли способ проверить, все еще существует? К сожалению, недостаточно проверить код 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(); 
       } 
      } 

     } 

    } 

ответ

1

Попробуйте использовать isAdded, чтобы проверить, если фрагмент присоединен к деятельности

Смежные вопросы