简体   繁体   English

Android:显示进度对话框

[英]Android :showing progress dialog

I am making an android application that gets updated. 我正在制作一个更新的Android应用程序。 For this I need a simple function that can download a file and show the current progress in a ProgressDialog. 为此,我需要一个简单的函数,可以下载文件并在ProgressDialog中显示当前进度。 I know how to do the download the file, but I'm not sure how to display the current progress.I am using the following method for downloading images. 我知道如何下载文件,但我不知道如何显示当前进度。我使用以下方法下载图像。

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;

}

And following is my async task class : 以下是我的异步任务类:

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

}

and i am calling the method in the following adapter class : 我正在调用以下适配器类中的方法:

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

I need to download 9 images but the problem i am facing is that it only shows the last image and progress dialog goes into infinite loop. 我需要下载9张图片,但我遇到的问题是它只显示最后一张图像,进度对话框进入无限循环。

Can anyone tell me over how to resolve thios issue. 任何人都可以告诉我如何解决thios问题。

Thanks 谢谢

I have already suggested you to use AsyncTask previously for your problems if you remember. 如果你还记得,我已经建议你以前使用AsyncTask来解决你的问题。

  1. onPreExecute() - show proress dialog onPreExecute() - 显示proress对话框
  2. doInBackground() - call your DownloadFile() method inside the doInBackground() doInBackground() - 在doInBackground()中调用你的DownloadFile()方法
  3. dismiss the progress dialog. 关闭进度对话框。

Go through this example and understand it and implement it in your way: AsyncTask with Progress Dialog 通过这个示例并理解它并以您的方式实现它: AsyncTask with Progress Dialog

I got the solution by working on it and the following should be the solution for this: 我通过研究得到了解决方案,以下应该是解决方案:

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

You have to use an AssyncTask to be able to easily communicate progress to the UI thread. 您必须使用AssyncTask才能轻松地将进度传达给UI线程。

For the dialog, use ProgressDialog : 对于该对话框,请使用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();
   }
}

And for the AssycTask, use an inner class in your Activity: 对于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();
   }
 }

ok, i see 2 potential problems here .. 好的,我在这看到2个潜在的问题..

  1. you have to use holder kind of structure for your adapter. 你必须使用持有人类型的适配器结构。

  2. in asyncTask, the imageView, should be different for each item in the listView. 在asyncTask中,imageView对于listView中的每个项目应该是不同的。 basically, you have to pass imageView as an argument to asyncTask. 基本上,你必须将imageView作为参数传递给asyncTask。

I changed your adapter, have a look at it. 我改变了你的适配器,看看它。

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

And also the asyncTask here. 还有asyncTask这里。 I made a constructor and passed imageView as argument. 我做了一个构造函数并将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]);
          }

         }

but i still can't guarantee the solution to infinite loop, but it is always good to fix some other problems :) 但我仍然不能保证无限循环的解决方案,但修复一些其他问题总是好的:)

HTH. HTH。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM