ekjyot
ekjyot

Reputation: 2227

Android :showing progress dialog

I am making an android application that gets updated. For this I need a simple function that can download a file and show the current progress in a 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.

Can anyone tell me over how to resolve thios issue.

Thanks

Upvotes: 4

Views: 4243

Answers (4)

ekjyot
ekjyot

Reputation: 2227

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

Upvotes: 3

Yashwanth Kumar
Yashwanth Kumar

Reputation: 29121

ok, i see 2 potential problems here ..

  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. basically, you have to pass imageView as an argument to 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. I made a constructor and passed imageView as argument.

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.

Upvotes: 0

You have to use an AssyncTask to be able to easily communicate progress to the UI thread.

For the dialog, use 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:

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

Upvotes: 0

Paresh Mayani
Paresh Mayani

Reputation: 128428

I have already suggested you to use AsyncTask previously for your problems if you remember.

  1. onPreExecute() - show proress dialog
  2. doInBackground() - call your DownloadFile() method inside the doInBackground()
  3. dismiss the progress dialog.

Go through this example and understand it and implement it in your way: AsyncTask with Progress Dialog

Upvotes: 4

Related Questions