2012-07-02 49 views
0

我遇到了與我的應用程序有關的問題。我將iOS系列的內部iPad應用程序從iOS移植到Android,並且圖像序列對於他們的設計是不可或缺的。它們需要標準的全屏停止,啓動,暫停功能,所有這些功能都可以在ImageView的子類中正常工作。但是在鎖定的進程對話框不斷出現之前,它只能顯示300個圖像中的2個。在不鎖定「主」線程的情況下顯示圖像

那麼有沒有一種「好」的方式來設置圖像/背景,而不鎖定主線程?

只是FYI AnimateDrawable不是我所需要的,因爲它不提供暫停/恢復功能,我擁有的序列數很容易達到數百個,平均數百幀。

+0

也許我沒有完全理解這個問題,但是你可以在一個單獨的線程上運行你的進程,然後跳回到主要更新UI? –

+0

問題似乎是加載圖像需要多長時間。定時器保持打勾狀態,因爲它需要。 Uri正在被大量時間解決,但設定圖像似乎需要很長時間。在崩潰之前,它通過的300個圖像URI只顯示一個或兩個圖像。此外ImageViews在UI工具包存在,並且根據文件,我們不能觸摸它的主線程之外。 – Mytheral

回答

1

可以asyncronously使用AsyncTask

只需要將相關的圖像加載代碼中doInBackground方法 加載圖像並嘗試設置就像一個進度條或進度對話框 的指標,所以你會開始示出的對話框或杆在裝載 的開頭和結束後駁回利用處理程序的對話框中onPostExecute方法

樣品代碼:

class SomeClass extends Activity { 
protected ProgressDialog pd ; 
protected Handler handler = new Handler(){ 
@Override 
public void handleMessage(int what){ 
    if(pd.isShowing()) 
     pd.dismiss(); 
} 
    ..... 

    class LoadImageTask extends AsyncTask<URL, Integer, Long> { 
      protected void onPreExecute(Long result) { 
      pd = ProgressDialog.show(getContext(),"Title","Message"); 
     } 

     protected Long doInBackground(URL... urls) { 

      //Load IMAGEs code 
      return totalSize; 
     } 



     protected void onPostExecute(Long result) { 
      //finish loadiing images 
       handler .sendEmptyMessage(0); 
     } 
    } 
    } 

我希望這會幫助你

0

幾件事情要添加到馬漢納德的回答是:

  • 你不一定必須做它的AsyncTask,線程會做;
  • 您可能希望將圖像呈現到一個專用的位圖,然後用Canvas.drawBitmap()以使其在onDraw()節省花費在UI線程渲染時間。
相關問題