安卓:显示进度对话框

4

我正在制作可以更新的安卓应用程序。为此,我需要一个简单的函数来下载文件并在 ProgressDialog 中显示当前进度。我知道如何下载文件,但不确定如何显示当前进度。我正在使用以下方法下载图像:

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张图片,但我遇到的问题是它只显示最后一张图片,并且进度对话框进入无限循环。

有人能告诉我如何解决这个问题吗?

谢谢。

4个回答

4

如果你还记得的话,我之前已经建议你在解决问题时使用AsyncTask

  1. onPreExecute() - 显示进度对话框
  2. doInBackground() - 在doInBackground()中调用DownloadFile()方法
  3. 关闭进度对话框。

请查看这个例子并理解它,然后按照自己的方式实现:带有进度对话框的AsyncTask


我已经完成了,但我面临的问题是进度对话框进入了无限循环。 - ekjyot
为什么是无限的?只需在onPostExecute()中检查if(dialog.isShowing()) { dialog.dismiss(); }是否显示即可。 - Paresh Mayani
是的,它在onPostExecute()方法内部。 - ekjyot

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);
        }
    }
}

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,请在您的Activity中使用内部类:

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

好的,我看到这里有两个潜在问题..

  1. 你必须为你的适配器使用holder结构。

  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]);
          }

         }

但我仍然不能保证无限循环的解决方案,但修复其他问题总是好的 :)

希望有所帮助。


是的,也许吧,但有些要点值得注意,比如将imageView作为参数传递。 - Yashwanth Kumar
那么还需要传递什么? - ekjyot
只有图像视图和URL已经在我的代码中完成。 - Yashwanth Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接