1

我正在尝试在 ListView 中的 galleryViews 中显示图像。我正在将图像从服务器下载到 SDCard 然后显示它,首先我检查缓存中的图像,如果图像不存在,然后我从 sdcard 加载它。

当用户第一次启动应用程序时,我正在从服务器下载图像并将它们保存到 SD 卡,同时我只显示带有文本的活动

我想如果图像不在 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);
  } 

  }
 }
}

谢谢

4

2 回答 2

1

更好地使用 Async Task 类http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html(使用 AsyncTask 部分),重要的是,注意大位图

http://developer.android.com/training/displaying-bitmaps/index.html

于 2012-05-29T10:24:27.363 回答
1

我使用适配器中的 onContentChanged() 方法解决了我的问题。我将图像保存到 sdCard 并获取 sdCard 路径将其保存到 sqlite 数据库中,因此当 sqlite 数据库中的数据发生更改时,会调用 onContentChanged 方法,因为我使用的是光标适配器。

于 2012-06-05T09:32:25.087 回答