2012-11-02 41 views
0

目前,我有一個類下載Asynctask的圖像擴展。 我想要實現一個小的進度條,以向用戶顯示在該空間中加載的圖像。我試圖將Asynctask類放在課堂活動中。現在的問題是調用我需要該類的類是靜態的。但是如果我把靜態類,我無法控制進度對話框。進度條小而下載的圖像不可見

我班DownloadImage:

public class DownloadImages extends Activity{ 

    public class DownloadImage extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 
//  progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleSmall); 

     public DownloadImage(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 

      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 
     protected void onPostExecute(Bitmap result) { 
      bmImage.setImageBitmap(result); 
      Log.e("TAG","IMAGEN CARGADA"); 
     } 

    // protected void onPreExecute(){ 
    // } 
    } 
} 

要創建的進度,我想我需要的類是一個活動:

progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleSmall); 

這是我創造了我的問題的解決方案:

public class DownloadImages extends Activity{ 

    ProgressBar progressBar = new ProgressBar(DownloadImages.this, null, android.R.attr.progressBarStyleSmall); 

    public class DownloadImage extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImage(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 

      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 
     protected void onPostExecute(Bitmap result) { 
      bmImage.setImageBitmap(result); 
      Log.e("TAG","IMAGEN CARGADA"); 
     } 

     protected void onPreExecute(){ 
      progressBar.setVisibility(View.VISIBLE); 
     } 
    } 
} 

現在的問題是,如果我打電話給DownloadImage,這個類必須是靜態的,但如果我這樣做E靜態我不能使用progressBar,除非它被聲明爲靜態,如果我認爲靜態我不能用我的活動創建它。

任何解決方案?

謝謝,我的英語不好

回答

0

使用WeakReference獲取您從中調用DownloadImage類的Activity的上下文,ProgressBar在其構造函數1st的參數中需要Context。

public class DownloadImages extends Activity{ 

ProgressBar progressBar = new ProgressBar(DownloadImages.this, null, android.R.attr.progressBarStyleSmall); 

public static class DownloadImage extends AsyncTask<String, Void, Bitmap> { 
    ImageView bmImage; 
    private WeakReference<DownloadImages> mWeakReference; 

    public DownloadImage(DownloadImages downloadImages, ImageView bmImage) { 
     this.bmImage = bmImage; 
     mWeakReference= new WeakReference<DownloadImages>(downloadImages); 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 

     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 
    protected void onPostExecute(Bitmap result) { 
     bmImage.setImageBitmap(result); 
     Log.e("TAG","IMAGEN CARGADA"); 
    } 

    protected void onPreExecute(){ 
     mWeakReference.get().progressBar.setVisibility(View.VISIBLE); 
    } 
} 

}

現在通過 '這個' 從活動當您啓動的AsyncTask。

+0

似乎是一個很好的解決方案。我現在如何調用?,在以這種方式調用之前,現在我需要添加另一個參數'new DownloadImages.DownloadImage((ImageView)vArea.findViewById(R.id.img_area))。execute(areas.get(o ).p2);' – jlopez

+0

DownloadImages.DownloadImage((this,ImageView)vArea.findViewById(R.id.img_area))。execu te(areas.get(o).p2); 也接受答案,如果這可以解決您的問題,所以其他人可能知道:) – Hardik4560

+0

不起作用,語法錯誤 – jlopez

0

對不起只是通過你的ProgressBar實例爲DownloadImage任務建構。

只要是這樣的(我假設你從活動創建的AsyncTask,所以this將指向它):

Progressbar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleSmall); 
DownloadImage downloadImage = new DownloadImage(someImageView, progressBar); 

,改變你的構造函數,因此它可以得到ProgressBar作爲參數。

+0

從哪裏傳遞? – jlopez