2012-04-29 5 views
0

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

У меня есть цикл для выполнения некоторых задач. Он отобразит изображение в ImageView для этой конкретной задачи. Так что выходит что-то вроде этого:

  • setImageResource
  • сделать какую-то задачу
  • подождите 1 второй
  • затем начать все снова, пока команды не закончится
  • , когда все команды конца, закрыть эту активность, call finish()

Я попытался использовать обработчик с runnable и asynctask, но я не могу заставить его работать. Пользовательский интерфейс всегда обновляется позже, чем 1 секунда. Когда я заканчиваю() после того, как команды заканчиваются, фотография кажется совсем не отображаемой.

for(int i=0; i<actions.size(); i++) { 
      switch((int)actions.get(i)[0]) { 
      case 0: 
       ivActionIcon.setImageResource(R.drawable.image); 
       sleeping=true; 
       DelayAsyncTask delay=new DelayAsyncTask(); 
       delay.execute(); 
       while(sleeping){}; 
       break; 
      } 
     } 
     finish(); 
class DelayAsyncTask extends AsyncTask<String, Void, Bitmap> { 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     try { 
      Thread.sleep(5000); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     sleeping=false; 
    } 

} 

Я использую переменную «спать», чтобы основной поток мог ждать задержки.

+1

Просьба указать соответствующий код и любые ошибки logcat. – Sam

ответ

0

Просто из предположения, что этот цикл находится где-то в потоке пользовательского интерфейса. Это означает, что вы блокируете поток пользовательского интерфейса до тех пор, пока асинк не завершится. Это НЕТ-НЕТ! Почему бы просто не обновить изображение в onPostExecute? Что-то вроде

class DelayAsyncTask extends AsyncTask<String, Void, Bitmap> { 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     try { 
      Thread.sleep(5000); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     ivActionIcon.setImageResource(R.drawable.new_image); 
    } 

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

while(sleeping){}; 
+0

Да, цикл находится в потоке пользовательского интерфейса. Я понимаю, что это не хорошо. Но я хочу сделать это, чтобы прочитать действие, отобразить это изображение действия за 500 мс, выполнить это действие, а затем вернуться к циклу для следующего действия. Это "while (sleep) {};" для. Если в цикле нет действия, я хочу закрыть действие. Вот почему я не хочу обновлять новое изображение в onPostExecute, потому что он выводит меня из цикла. –

+0

, вы НЕ должны выполнять это в потоке пользовательского интерфейса, это может привести к тому, что Android закроет ваше приложение. Вы должны переместить весь цикл в асинтезу (или, может быть, несколько для каждой задачи). Пока asynctask inline, вы можете закончить() действие, когда все будет сделано. – MikeIsrael

+0

Спасибо, Майк! Я поместил цикл в doInBackground, и я обновляю пользовательский интерфейс, используя progressUpdate. Сейчас он работает нормально. –

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