2012-08-10 112 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)