Async Загрузка изображений в виде галереи в Listview с SDCard
Я пытаюсь отобразить изображения в galleryViews, которые находятся в ListView. Я загружаю изображения с сервера на SDCard и затем отображаю их. Сначала я проверяю изображения в кеше, если изображения там нет, затем загружаю их с SDCard.
когда пользователь запускает приложение в первый раз, я загружаю изображения с сервера и сохраняю их в SDCard в то же время, показывая работу только с текстом
Я хочу, если изображение отсутствует в SDCard, после загрузки изображения, оно должно отображать изображение, как только изображение загружается, вот что я делаю.
public class AsyncImageLoader {
private boolean isImageView;
private final LinkedHashMap<String, Bitmap> cache =
new LinkedHashMap<String, Bitmap>(60, (float) 1.0, true);
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
LoadImageFromSdCard loadImage = (LoadImageFromSdCard) msg.obj;
if (isImageView) {
loadImage.imageView.setImage(loadImage.bmp);
} else {
Thread thread = new Thread(new LoadImageFromSdCard(loadImage.uri, loadImage.imageView));
try {
Log.i("AsyncImageLoader", "SECOND THREAD STARTED");
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.start();
}
}
};
public Bitmap loadImage(String uri,
ImageTextComboControl imageView) {
if (cache.containsKey(uri)) {
return cache.get(uri);
} else {
handler.post(new LoadImageFromSdCard(uri, imageView));
}
return null;
}
private class LoadImageFromSdCard implements Runnable {
String uri;
ImageTextComboControl imageView;
ImageView image;
Bitmap bmp = null;
public LoadImageFromSdCard(String uri, ImageTextComboControl imageView) {
this.uri = uri;
this.imageView = imageView;
}
public void run() {
FileInputStream fis;
try {
fis = new FileInputStream(new File(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}
bmp = BitmapFactory.decodeStream(fis);
if (imageView != null) {
isImageView = true;
cache.put(uri, bmp);
Message message = new Message();
message.obj = this;
handler.sendMessage(message);
}
}
}
}
Thanx
2 ответа
Я решил свою проблему, используя метод onContentChanged() в адаптере. Я сохраняю изображения в sdCard и получаю путь sdCard, сохраняя его в базе данных sqlite, поэтому при изменении данных в базе данных sqlite вызывается метод onContentChanged, потому что я использую Cursor Adapter.
Гораздо лучше использовать класс Async Task http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html (используя раздел AsyncTask) и, что важно, позаботиться о большом растровом изображении
http://developer.android.com/training/displaying-bitmaps/index.html