2011-10-24 129 views
3

我正在製作一個更新的android應用程序。爲此,我需要一個簡單的函數,可以下載一個文件並在ProgressDialog中顯示當前的進度。我知道如何下載文件,但我不知道如何顯示當前的進度。我正在使用以下方法下載圖像。Android:顯示進度對話框

public Bitmap DownloadFile(String url){ 
URL myFileUrl; 
Bitmap bitmap=null; 
try { 
myFileUrl = new URL(imageUrl); 
    HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); 
    conn.setDoInput(true); 
    conn.setConnectTimeout(10000); 
    conn.setReadTimeout(10000); 
    conn.connect(); 
    InputStream is = conn.getInputStream(); 
    bmImg = BitmapFactory.decodeStream(is); 
    bitmap = BitmapFactory.decodeStream((InputStream) new URL( 
     imageUrl).getContent()); 
    bitmap = Bitmap.createScaledBitmap(bitmap,80 , 80, true); 
    System.out.println("name of butmap"+bitmap.toString()); 

} catch (Exception e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
return bitmap; 

} 

而以下是我的異步任務等級:

public class BackgroundAsyncTask extends AsyncTask<String, Integer, Bitmap> { 

    int myProgress; 

    @Override 

    protected void onPostExecute(Bitmap result) { 
    dialog.dismiss(); 
    iv.setVisibility(View.VISIBLE); 
    iv.setImageBitmap(result); 
    System.out.println("bbbbbbbbb"); 
    System.out.println("post execute"); 
    } 

@Override 
protected void onPreExecute() { 
    System.out.println("pre execute"); 
    dialog = ProgressDialog.show(ProfileNormalUserPhotos.this, "Loading...", "Please wait..."); 

} 

@Override 
protected Bitmap doInBackground(String...paths) { 
    System.out.println(imageUrl+" imageurl"); 
    return DownloadFile(imageUrl); 

    } 
@Override 
protected void onProgressUpdate(Integer... values) { 
    // TODO Auto-generated method stub 
     progressBar.setProgress(values[0]); 
} 

} 

和我打電話以下適配器類中的方法:

public class ImageAdapter extends BaseAdapter { 
     Context mContext; 
    public String[] stringOnTextView; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

public ImageAdapter(Context Context, 
    String[] stringOnTextView) { 
    this.mContext=Context; 
    this.stringOnTextView=stringOnTextView; 
} 

public int getCount() { 
     return stringOnTextView.length; 
    } 


public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 


    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = null; 
     if(convertView==null){ 

      try{ 

      { 
        LayoutInflater li = getLayoutInflater(); 
        v = li.inflate(R.layout.icon, null); 
        TextView tv = (TextView)v.findViewById(R.id.text); 
        tv.setText("Profile Image "+(position+1)); 
        iv= (ImageView)v.findViewById(R.id.image); 

        imageUrl = "http://ondamove.it/English/images/users/"; 
        imageUrl=imageUrl+stringOnTextView[position]; 
        new BackgroundAsyncTask().execute(imageUrl); 


        } 
      }catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println(e); 
     } 
     } 
     else 
     { 
      try{ 
      v = convertView;} 
      catch(Exception e){ 
       System.out.println(e); 
      } 
     } 
     return v; 
    } 
} 

我需要下載9倍的圖像,但問題我面對的是它只顯示最後的圖像和進度對話框進入無限循環。

任何人都可以告訴我如何解決thios問題。

感謝

回答

3

我通過它的工作得到了解決和下面應該是這樣的解決方案:

class DownloadFileAsync extends AsyncTask<String, String, String> 
{ 
    int count; 
    URL myFileUrl; 
    ImageView imageview; 
    Bitmap bp; 

    public DownloadFileAsync(ImageView iv, URL uu) 
    { 
     this.imageview = iv; 
     this.myFileUrl = uu; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     showDialog(DIALOG_DOWNLOAD_PROGRESS); 
    } 

    @Override 
    protected String doInBackground(String... aurl) 
    { 
     for (int i = 0; i < aurl.length; i++) 
      System.out.println("----------" + i + "------" + aurl[i]); 

     try 
     { 
      HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 
      conn.setConnectTimeout(10000); 
      conn.setReadTimeout(10000); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      bmImg = BitmapFactory.decodeStream(is); 
      bp = BitmapFactory.decodeStream((InputStream) (myFileUrl).getContent()); 
      bp = Bitmap.createScaledBitmap(bp, 70, 70, true); 

     } 
     catch (Exception e) 
     { 
      System.out.println(e); 
      e.printstacktrace(); 
     } 

     return null; 
    } 

    protected void onProgressUpdate(String... progress) 
    { 
     dialog.setProgress(Integer.parseInt(progress[0])); 
    } 

    @Override 
    protected void onPostExecute(String unused) 
    { 
     try 
     { 
      imageview.setImageBitmap(bp); 
      System.out.println("this is" + this); 
      // dialog.dismiss(); 
      dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 

     } 
     catch (Exception e) 
     { 
      System.out.println(e); 
     } 
    } 
} 
4

我已經建議你,如果你還記得使用AsyncTask之前爲你的問題。

  1. onPreExecute() - 顯示proress對話框
  2. doInBackground() - 調用doInBackground內的DownloadFile()方法()
  3. 駁回進度對話框。

通過這個例子你去了解它,並在你的方式實現它:AsyncTask with Progress Dialog

+0

我已經做到了,但我面臨的問題是,進度對話框進入無限循環。 – ekjyot

+0

爲什麼無限?只要檢查是否(dialog.isShowing()){dialog.dismiss(); }裏面的onPostExecute() –

+0

是的,它是在onPostExecute()方法 – ekjyot

0

你必須使用一個AssyncTask能夠很容易溝通進展到UI線程。

對於對話框中,使用ProgressDialog

private void downloadFile(URL fileUrl) { 
    if (myProgressDialog == null) { 
     new DownloadFilesTask().execute(fileUrl); 
     myProgressDialog = ProgressDialog.show(this, "Downloading file " + fileUrl.toString(), "Wait patiently, your download is in progress.", true /*You wont have a time estimate*/, false /*Download cannot be canceled*/); 
    } else { 
     Log.e(LOG_TAG, "A download is already in progress"); 
    } 
} 

private void hideDialog() { 
    if (myProgressDialog != null) { 
     myProgressDialog.cancel(); 
    } 
} 

而對於AssycTask,在活動中使用一個內部類:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Boolean> { 
    protected Long doInBackground(URL... urls) { 
     // TODO Download file here 
     return true; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     // TODO nothing to do here, you don't have download details 
    } 

    protected void onPostExecute(Boolean result) { 
     MyActivity.this.hideProgressDialog(); 
    } 
} 
0

好吧,我在這裏看到2層潛在的問題..

  1. 您必須爲您的適配器使用支架類結構。

  2. 在asyncTask中,imageView應該不同於listView中的每個項目。基本上,您必須將imageView作爲參數傳遞給asyncTask。

我改變了你的適配器,看看它。

static class ViewHolder { 

      TextView tv; 
      ImageView iv; 

    } 


    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder vh; 
     View v = null; 

     if(convertView==null){ 

        vh = new ViewHolder(); 
        LayoutInflater li = getLayoutInflater(); 
        v = li.inflate(R.layout.icon, null); 
        vh.tv = (TextView)v.findViewById(R.id.text); 
        vh.iv= (ImageView)v.findViewById(R.id.image); 
        v.setTag(vh); 
     } 
     else 
     { 
      vh = (ViewHolder) convertView.getTag(); 
      v = convertView; 
     } 

     vh.tv.setText("Profile Image "+(position+1)); 
     imageUrl = "http://ondamove.it/English/images/users/"; 
     imageUrl=imageUrl+stringOnTextView[position]; 
     new BackgroundAsyncTask(vh.iv).execute(imageUrl); 

     return v; 
    } 

而且這裏還有asyncTask。我做了一個構造函數並將imageView作爲參數傳遞。

public class BackgroundAsyncTask extends AsyncTask<String, Integer, Bitmap> { 

      int myProgress; 
      ImageView iv; 

      public BackgroundAsyncTask (ImageView imageView) { 
       iv = imageView; 
      } 

      @Override 
      protected void onPostExecute(Bitmap result) { 
       dialog.dismiss(); 
       iv.setVisibility(View.VISIBLE); 
       iv.setImageBitmap(result); 
       System.out.println("bbbbbbbbb"); 
       System.out.println("post execute"); 
      } 

      @Override 
      protected void onPreExecute() { 
       System.out.println("pre execute"); 
      dialog = ProgressDialog.show(ProfileNormalUserPhotos.this, "Loading...", "Please wait..."); 

      } 

      @Override 
      protected Bitmap doInBackground(String...paths) { 
       System.out.println(imageUrl+" imageurl"); 
       return DownloadFile(imageUrl); 

     } 
      @Override 
      protected void onProgressUpdate(Integer... values) { 
      // TODO Auto-generated method stub 
      progressBar.setProgress(values[0]); 
      } 

     } 

,但我仍然不能保證解決無限循環,但它始終是好解決一些其他問題:)

HTH。

+1

內部很抱歉說,但它沒有幫助.. – ekjyot

+0

是的,可能是,但有些值得注意,如傳遞imageView作爲參數。 –

+0

那麼還有什麼應該通過 – ekjyot