2012-08-10 121 views
12

在我的android应用程序中,我从云端下载图像。下载是在线程中执行的,并且在同一个线程中,我还使用新下载的映像设置了图像视图。设置图像后,我打电话给postinvalidate()如何立即刷新图像视图

但是图像不会立即显示出来。有没有办法让重绘立即发生?我需要一种触发绘图循环的方法。

回答

38

每个其从View类派生的类具有invalidate()postInvalidate()方法期间立即而不是重绘。如果invalidate()被调用,它会告诉系统当前视图已更改,并且应尽快重新绘制。由于此方法只能从您的UIThread调用,因此您需要另一种方法,当您在而不是中的UIThread并且仍然想通知系统您的视图已更改。方法postInvalidate()通知系统从非UIThread和视图获取尽快重绘在UIThread上的下一个事件回调

在您的情况下,您可以在AsyncTask(智能背景线程)的帮助下实现您想要的目标.AsyncTask支持正确和方便地使用UI线程。该类允许执行后台操作(在您的案例中下载后台图像),并在UI线程上发布结果(将您的位图设置为ImageView),而无需操作线程和/或处理程序。

异步任务由在后台线程上运行并且其结果在UI线程上发布的计算定义。异步任务定义为3个泛型类型,称为参数,进度和结果,以及4个步骤,称为begin,doInBackground,processProgress和end。

4个步骤

当执行一个异步任务,任务经过4个步骤:

onPreExecute(),调用执行任务之后立即在UI线程上。此步骤通常用于设置任务,例如通过在从云下载映像之前在用户界面中显示进度条并用于提供良好的用户体验。

doInBackground(Params...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数传递给此步骤。计算结果必须通过该步骤返回并返回到最后一步。此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单元。这些值在onProgressUpdate(Progress ...)步骤中发布在UI线程上。

onProgressUpdate(Progress...),在调用publishProgress(Progress...)后在UI线程上调用。执行的时间是未定义的。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。

onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为该方法中的参数传递给此步骤,您可以将位图设置为imageView并使视图无效

+4

圣牛,这里有一个+1 – Korcholis 2012-08-10 07:53:08

2

您是否尝试过使用invalidate()?它迫使视图将在接下来的周期

+0

但这不是UI线程,虽然... – user1583075 2012-08-10 00:25:24

+0

我还没有尝试过,现在,但它似乎你可以在'onPostExecute()'中这样做。看到一个参考[​​这里](http://stackoverflow.com/questions/3960886/problem-with-calling-invalidate-in-async-task-thread-in-android) – Korcholis 2012-08-10 00:33:12

+0

哦,我现在看到你的问题。我一直在期待你使用'AsyncTask'的所有时间。我的错,对不起 – Korcholis 2012-08-10 07:53:43

0
new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       while (!socket.isClosed()) { 
        imgArray = receiveImagebytes(); 
       } 
      } 
     }).start(); 

     try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


while (!socket.isClosed()) { 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        imageView.setImageBitmap(BitmapFactory.decodeByteArray(imgArray, 0, imgArray.length)); 
        imageView.invalidate(); 
       } 
      }); 
2

失效不起作用。暂时更改uri或url或图像的路径并将其更改回所需的路径。举例来说,如果我有

image_url="myhost/img.png"; 
himg.setImageUrl(image_url, imageLoader); 

我可以为刷新此:

himg.setImageUrl(null, imageLoader); 
himg.setImageUrl(image_url, imageLoader)