Breaking News
Loading...
Saturday, 29 September 2012

execute AsyncTask with series of parameters to load image(s) from internet

06:50
The previous example describe how to "Load Bitmap from internet in background thread using AsyncTask" to load ONE image only. If you have to load 10 images, is it need to create 10 AsyncTasks? obviously NO.

It can be noticed that the parameters passed to doInBackground() method is URL... urls, a series of parameter. In order to pass data to doInBackground(), put them in execute() call of AsyncTask object.

Here is the modified code to load 5 images from internet in AsyncTask, and update ImageViews and ProgressBar on the run, in onProgressUpdate() method.

execute AsyncTask with series of parameters to load image(s) from internet


package com.example.androidcolor;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends Activity {

ProgressBar loadingProgressBar;
ImageView[] targetImage = new ImageView[5];

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
targetImage[0] = (ImageView)findViewById(R.id.target0);
targetImage[1] = (ImageView)findViewById(R.id.target1);
targetImage[2] = (ImageView)findViewById(R.id.target2);
targetImage[3] = (ImageView)findViewById(R.id.target3);
targetImage[4] = (ImageView)findViewById(R.id.target4);

loadingProgressBar = (ProgressBar)findViewById(R.id.loadingprogress);

//Load bitmap from internet
//As a example, I make all images load from the same source
String onLineImage0 = "http://goo.gl/1VArP";
String onLineImage1 = "http://goo.gl/1VArP";
String onLineImage2 = "http://goo.gl/1VArP";
String onLineImage3 = "http://goo.gl/1VArP";
String onLineImage4 = "http://goo.gl/1VArP";
URL onLineURL0, onLineURL1, onLineURL2, onLineURL3, onLineURL4;

try {
onLineURL0 = new URL(onLineImage0);
onLineURL1 = new URL(onLineImage1);
onLineURL2 = new URL(onLineImage2);
onLineURL3 = new URL(onLineImage3);
onLineURL4 = new URL(onLineImage4);
new MyNetworkTask(5, targetImage, loadingProgressBar)
.execute(onLineURL0, onLineURL1, onLineURL2, onLineURL3, onLineURL4);
} catch (MalformedURLException e) {
e.printStackTrace();
}

}

private class MyNetworkTask extends AsyncTask<URL, Integer, Void>{

ImageView[] tIV;
Bitmap[] tBM;
ProgressBar tProgressBar;

public MyNetworkTask(int numberOfImage, ImageView[] iv, ProgressBar pb){

tBM = new Bitmap[numberOfImage];

tIV = new ImageView[numberOfImage];
for(int i = 0; i < numberOfImage; i++){
tIV[i] = iv[i];
}

tProgressBar = pb;
}

@Override
protected Void doInBackground(URL... urls) {

if (urls.length > 0){
for(int i = 0; i < urls.length; i++){
URL networkUrl = urls[i];

try {
tBM[i] = BitmapFactory.decodeStream(
networkUrl.openConnection().getInputStream());
} catch (IOException e) {
e.printStackTrace();
}

publishProgress(i);

//insert dummy delay to simulate lone time operation
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
return null;
}

@Override
protected void onPostExecute(Void result) {
Toast.makeText(getBaseContext(), "Finished", Toast.LENGTH_LONG).show();
}

@Override
protected void onProgressUpdate(Integer... values) {

if(values.length > 0){
for(int i = 0; i < values.length; i++){
tIV[values[i]].setImageBitmap(tBM[values[i]]);
tProgressBar.setProgress(values[i]+1);
}
}

}

}

}


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
tools:context=".MainActivity" />
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:id="@+id/loadingprogress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="5"
android:progress="0"/>
<ImageView
android:id="@+id/target0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/target1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/target2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/target3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/target4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</LinearLayout>


Remark: Permission of "android.permission.INTERNET" is needed in AndroidManifest.xml.

download filesDownload the files.

0 comments:

Post a Comment

 
Toggle Footer