2012-04-29 99 views
0

我是编程新手,我已经为此挣扎了好几天,无法让它工作。延迟更新照片

我有一个循环来执行一些任务。它将在ImageView中显示该特定任务的图片。因此,它是这样的:

  • setImageResource
  • 做一些任务
  • 等待1秒
  • 然后重新启动一切,直到命令结束
  • 当所有命令结束时,通过关闭活动呼叫完成()

我试着用runnable和asynctask处理程序,但我无法让它工作。用户界面总是比1秒延迟更新。正如我在命令结束后调用finish(),照片似乎根本不显示。

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 2012-04-29 14:38:16

回答

0

只是猜测这个循环是在UI线程中的某个地方。这意味着你要阻止UI线程,直到异步结束。这是一个NO-NO!为什么不更新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

是的,循环在UI线程中。我知道这不好。但是我想要做的是读取一个动作,将该动作图像显示500ms,执行该动作,然后返回到下一个动作的循环。那是“while(sleeping){};”是为了。如果循环中没有动作,我想关闭活动。这就是为什么我不想更新onPostExecute中的新图像,因为它让我走出了循环。 – 2012-04-30 14:38:37

+0

您不应该在UI线程中执行此操作,它可能会导致Android强制关闭您的应用程序。你应该将整个循环移动到一个asynctask(或者对每个任务来说可能是几个)。只要asynctask是内嵌的,那么当完成所有事情时,您可以完成()该活动。 – MikeIsrael 2012-05-01 06:37:19

+0

谢谢迈克!我把循环放在doInBackground中,并使用progressUpdate更新UI。现在工作正常。 – 2012-05-01 15:59:19