2011-12-11 7 views
0

私の活動では、いくつかのイメージをダウンロードし、それぞれをメインレイアウトに追加して表示します。私はこれらの3つのアプローチを試みたが、イメージがロードされるまで、それぞれの時間は、私の進捗ダイアログがフリーズ:非同期タスクでダイアログがフリーズする

第一のアプローチ:非同期タスクを使用して:私はdoInBackground(上の画像をダウンロード)し、メインレイアウトに追加onPostExecuteを()

第二:上記と同じですが、私は第三の各画像の1 onProgressUpdate()

追加:数秒間ダイアログフリーズハンドラとスレッド

たびに進歩を使用して(実際には全体をアプリケーションがフリーズします)、画像がダウンロードされて画面に表示されます。

私は長い間この問題を解決しようとしていますが、まだ何もしていません。何か案は?ここに私のコードの一部です:

 protected Integer doInBackground(Void... params) {   
     //... 
      try { 
       //download images 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      if (!loadTask.isCancelled()) {     
       //Display images   
       int length=imageList.size();   

       for (i=0; i<length; i++) {      
        publishProgress(i);      
       } 
      }    

     return 1;      
    } 

    protected void onProgressUpdate(Integer... a) { 
     //interaction with UI thread 
     int i = a[0]; 
     ImageView im = new ImageView (MyActivity.this); 
     im.setImageBitmap(getRemoteImage(imageUrl)); 
     im.setLayoutParams(Params); 
     im.setAdjustViewBounds(true); 
     im.setPadding(px2, px2, px2, px2); 
     im.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        //... 
       }    
     }); 
    } 
+0

どのようにAsyncTaskを実行していますか? – dmon

+0

loadTask = new LoadingTask(); loadTask.execute(); – MScott

答えて

2
im.setImageBitmap(getRemoteImage(imageUrl)); 

getRemoteImage()が、それは名前と引数ことを示唆している(ウェブから画像をダウンロードする)何している場合、それがonProgressUpdate()で実行されますから、この行は、あなたの問題です。

onProgressUpdate()は、バックグラウンドスレッドではなくUIスレッドで実行され、進行状況が変更されたときにUI作業を行うことになっています。ここでイメージをダウンロードすると、イメージのダウンロードが完了するまでにUIスレッドがブロックされます。すべての画像をループするので、すべての画像がダウンロードされるまでUIスレッドが保持されます。

むしろ(メソッドの一番上にあなたのコメントは、あなたがすでにそれを行うことを示唆している)doInBackground()でダウンロードを実行し、publishProgress()がかかるという議論を経てonProgressUpdateに超えるダウンロードした画像を渡します。

+0

それは本当に問題でした!レイアウトを更新するだけではなく、onProgressUpdate()の計算をしないでください。ありがとう! – MScott