Reputation: 2227
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
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
Reputation: 29121
ok, i see 2 potential problems here ..
you have to use holder kind of structure for your adapter.
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
Reputation: 2578
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
Reputation: 128428
I have already suggested you to use AsyncTask previously for your problems if you remember.
Go through this example and understand it and implement it in your way: AsyncTask with Progress Dialog
Upvotes: 4