2016-12-21 3 views
0

В настоящее время у меня есть кнопка, которая загружает активность.Ждите действия для отображения

Эта активность имеет ListView в ней, которая по какой-либо причине занимает довольно много времени для загрузки (не дожидаясь данных, данные уже находятся в памяти). Проблема в том, что пока он отображает список, пользовательский интерфейс ждет, где была нажата кнопка, и не меняет экран, пока список не будет полностью загружен.

Что бы я хотел, это отображать список только после того, как активность загружена, так что по крайней мере что-то произойдет, как только они нажмут кнопку (очень важный пользовательский интерфейс).

В настоящее время мой взломать решение этой проблемы - это создать поток, подождать 50 миллисекунд, а затем установить адаптер для моего списка (используя runOnUiThread). Конечно, если для загрузки некоторых устройств требуется более 50 мс, то для загрузки активности придется загрузить весь список.

Текущий соответствующий код:

@Override 
public void onPostResume() { 
    super.onPostResume(); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      final AdapterData data = getData(); 
      try { 
       Thread.sleep(50); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      mActivity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        myAdapter = new MyAdapter(MyActivity.this, data); 
        lvMyList.setAdapter(myAdapter); 
       } 
      }); 
     } 
    }).start(); 
} 

Я просто изменил имена переменных в коде, но это не имеет значения. Это просто, чтобы вы могли увидеть мое общее решение.

Я чувствую, что должен быть какой-то обратный вызов, который называется, когда действие завершается созданием. Я думал, что onPostResume ждал завершения операции, но это не сработало. Он все еще висел.

+0

В качестве первого решения, я хотел бы предложить, чтобы создать статический публичный Runnable переменную внутри запущенного деятельности, что вы можете выполнить, когда загрузка завершена. Это достаточно? –

+0

Я не понимаю, что вы просите меня сделать. «что вы можете выполнить, когда загрузка закончилась». Моя проблема в том, что я не знаю, когда загрузка закончилась. Я знаю, как запустить runnable, как вы можете видеть в моем опубликованном решении. Моя проблема - это знать, когда ее выполнять, так как ожидания 50 мс кажутся очень ОЧЕНЬ плохим решением. – Cruncher

+0

Простите, может быть, я не понимаю, когда именно в коде есть отставание. Вам нужно дождаться окончания getData()? Или это слишком долго для отображения после загрузки? На самом деле я пропущу точку, возможно ...:/ –

ответ

1

вы можете использовать IdleHandler

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.xxx); 
    final AdapterData data = getData(); 
    IdleHandler handler = new IdleHandler() { 

     @Override 
     public boolean queueIdle() { 
      myAdapter = new MyAdapter(MyActivity.this, data); 
      lvMyList.setAdapter(myAdapter); 
      return false; 
     } 
    }; 
    Looper.myQueue().addIdleHandler(handler); 

} 
+0

собирается сделать этот снимок сегодня и сообщить вам, как это работает. Спасибо за ответ – Cruncher

+0

Привет, Питер, похоже, он точно справляется с тем, что мне нужно. Большое спасибо за ваш ответ. Я удивлен, что я не мог найти этот googling нигде! Быстрый вопрос: что означает значение возврата? В каком случае вы вернетесь? – Cruncher

+0

Последний вопрос: это хорошая практика вообще? Часто ли используются обработчики простоя? – Cruncher

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

  • Нет связанных вопросов^_^