【问题标题】:Android :showing progress dialogAndroid:显示进度对话框
【发布时间】:2011-10-24 06:06:35
【问题描述】:

我正在制作一个更新的 android 应用程序。为此,我需要一个可以下载文件并在 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 张图片,但我面临的问题是它只显示最后一张图片,并且进度对话框进入无限循环。

谁能告诉我如何解决 thios 问题。

谢谢

【问题讨论】:

    标签: android progressdialog


    【解决方案1】:

    如果你记得的话,我已经建议你使用AsyncTask 来解决你的问题。

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

    通过这个例子并理解它并以你的方式实现它:AsyncTask with Progress Dialog

    【讨论】:

    • 我已经做到了,但我面临的问题是进度对话框进入无限循环。
    • 为什么是无限的?只需检查 if(dialog.isShowing()) { dialog.dismiss(); } 在 onPostExecute() 中
    • 是的,它在 onPostExecute() 方法中
    【解决方案2】:

    我通过研究得到了解决方案,以下应该是解决方案:

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

    【讨论】:

      【解决方案3】:

      您必须使用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();
         }
       }
      

      【讨论】:

        【解决方案4】:

        好的,我在这里看到了 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。

        【讨论】:

        • 是的,可能是,但有些点值得注意,例如将 imageView 作为参数传递。
        • 那还要传递什么
        • 仅在我的代码中已经完成的图像视图和 url。
        猜你喜欢
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多