Hi all guys,
I tried to get the pics from internet and display all the results in
the Gridview with a dynamic updated. However it doesn't work properly.
I did some research on the internet and using AsyncTask class to avoid
the block of the UI Thread. But I just can't get the Gridview
Dynamiclly updated well.
Here is the code snippet:
public class GridViewMultiThread extends Activity {
Button button = null;
GridView gridView = null;
Context context = null;
ImageAdapter imageAdapter;
private View mSearchPanel;
DownloadPhotosTask downloadPhotosTask;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
gridView = (GridView) findViewById(R.id.showPhotoGridView);
imageAdapter = new ImageAdapter(this);
gridView.setAdapter(imageAdapter);
downloadPhotosTask = (DownloadPhotosTask) new DownloadPhotosTask
().execute();
// button.setOnClickListener(new OnClickListener() {
// @Override
// public void onClick(View v) {
// button.setEnabled(false);
// downloadPhotosTask = (DownloadPhotosTask) new
DownloadPhotosTask
()
// .execute();
// }
// });
}
class DownloadPhotosTask extends AsyncTask<Void, Photo, Void>
implements
PhotoDownloadListener {
// @Override
// protected void onPreExecute() {
// if (mSearchPanel == null) {
// mSearchPanel = ((ViewStub)
findViewById(R.id.stub_search))
// .inflate();
//
// ProgressBar progress = (ProgressBar)
mSearchPanel
// .findViewById(R.id.progress);
// progress.setIndeterminate(true);
//
// ((TextView)
mSearchPanel.findViewById(R.id.label_loading))
// .setText("loading");
//
// final View cancelButton = mSearchPanel
//
.findViewById(R.id.button_cancel);
// cancelButton.setOnClickListener(new
View.OnClickListener() {
// public void onClick(View v) {
// onCancelSearch();
// }
// });
// }
// }
// private void onCancelSearch() {
// if (downloadPhotosTask != null
// && downloadPhotosTask.getStatus() ==
AsyncTask.Status.RUNNING)
{
// downloadPhotosTask.cancel(true);
// downloadPhotosTask = null;
// }
// }
@Override
protected Void doInBackground(Void... params) {
DownLoader.getInstance().downLoadImage(this);
return null;
}
@Override
public void onPhotoDownloadListener(Photo photo) {
if (photo != null && !isCancelled()) {
publishProgress(photo);
}
}
@Override
public void onProgressUpdate(Photo... photos) {
for (Photo photo : photos) {
imageAdapter.addPhoto(photo);
gridView.invalidateViews();
// imageAdapter.registerDataSetObserver(observer)
}
}
}
}
class ImageAdapter extends BaseAdapter {
private Context mContext;
private List<Photo> photos = new ArrayList<Photo>();
public ImageAdapter(Context context) {
this.mContext = context;
}
public void addPhoto(Photo photo) {
photos.add(photo);
}
@Override
public int getCount() {
return photos.size();
}
@Override
public Object getItem(int position) {
return photos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
final ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageBitmap(photos.get(position).getBm());
return imageView;
}
}
class DownLoader {
private static DownLoader downloader = new DownLoader();
private static String[] myImageURL = null;
private List<Photo> photos = new ArrayList<Photo>();
public static DownLoader getInstance() {
initImageURL();
return downloader;
}
static void initImageURL() {
int no = 0;
myImageURL = new String[100];
for (int i = 0; i < myImageURL.length; i++) {
myImageURL[i] = "http://cp.a8.com/image/128X128GIF/8" +
no +
".gif";
no++;
if (no % 10 == 0) {
no = 0;
}
}
}
public List<Photo> downLoadImage(PhotoDownloadListener listener) {
List<String> urls = Arrays.asList(myImageURL);
List<Photo> photos = new ArrayList<Photo>();
URL aryURI = null;
URLConnection conn = null;
InputStream is = null;
Bitmap bm = null;
Photo photo = null;
for (String url : urls) {
// Log.e("URL:", url);
try {
aryURI = new URL(url);
conn = aryURI.openConnection();
is = conn.getInputStream();
bm = BitmapFactory.decodeStream(is);
photo = new Photo(bm);
listener.onPhotoDownloadListener(photo);
photos.add(photo);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return photos;
}
}
class Photo {
private Bitmap bm;
public Photo(Bitmap bm) {
this.bm = bm;
}
public Bitmap getBm() {
return bm;
}
public void setBm(Bitmap bm) {
this.bm = bm;
}
interface PhotoDownloadListener {
public void onPhotoDownloadListener(Photo photo);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<GridView android:id="@+id/showPhotoGridView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="3" android:verticalSpacing="10dp"
android:horizontalSpacing="10dp" />
<ViewStub android:id="@+id/stub_search" android:inflatedId="@+id/
panel_search"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
</LinearLayout>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---