使用通用图像加载器保存和加载图像

时间:2014-11-03 11:29:33

标签: android caching picasso

更新

如前所述,我使用了通用图像加载器。但我收到一些错误。 **这是我第一次玩这种东西。

以下是我的代码:

以下是使用async将位图保存到内部存储的代码:

Uri uri = Crop.getOutput(result);

        try {
            bmp = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            new saveDpToDisk().execute(bmp);
        }
class saveDpToDisk extends AsyncTask{

    @Override
    protected Object doInBackground(Object[] params) {
        try {
            fos = openFileOutput("ProPic", Context.MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        bmp.compress(Bitmap.CompressFormat.JPEG, 60, fos);
        return bmp;
    }
}

以下是使用UIL从存储加载图像的代码:

@Override
    protected Object doInBackground(Object[] params) {

        FileInputStream fis;
        try {
            fis = openFileInput("ProPic");
            String uri = String.valueOf(fis);
            DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisk(true).build();
            ImageLoader loader = ImageLoader.getInstance();
            loader.displayImage(uri, pro_pic, options);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return pro_pic;
    }
}

这是我得到的错误(app不强制关闭,错误只出现在logcat

UIL doesn't support scheme(protocol) by default [java.io.FileInputStream@42987180]. You should implement this support yourself (BaseImageDownloader.getStreamFromOtherSource(...))
java.lang.UnsupportedOperationException: UIL doesn't support scheme(protocol) by default [java.io.FileInputStream@42987180]. You should implement this support yourself (BaseImageDownloader.getStreamFromOtherSource(...))
        at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromOtherSource(BaseImageDownloader.java:235)
        at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:97)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(LoadAndDisplayImageTask.java:290)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDisk(LoadAndDisplayImageTask.java:273)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:229)
        at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:135)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)

________ X _____________________ X ___________________________ X _______________________

原始问题

我的应用只需要加载一个图片(用户可以从图库中选择设置为该应用的dp)。

所以,我做了什么是我使用FileOutputStream将选定的图片保存到存储,然后使用活动的onResume方法中的FileInputStream加载图片。

但是,当所选图片太大时,应用程序启动速度太慢(需要时间来充气视图),而logcat显示30-60 MB的内存堆。

所以,我想把图像存储在缓存和加载中,但是没有找到一种方法。

我应该使用 picasso 吗?如果是,如何使用它来保存和从缓存中进行保存。

或者还有其他方法可以实现我的需求吗?

1 个答案:

答案 0 :(得分:3)

如果您通过Koush在G +上阅读this帖子,您将获得明确的解决方案,我已经提出了这个问题的总结,因为Android-Universal-Image-Loader是您的要求的赢家!

    如果您使用网络,
  • Picasso 拥有最好的图片API!

  • UrlImageViewHelper + AndroidAsync 是最快的。玩这些 其他两个很棒的库真的突出了图像API 但是,已经过时了。

  • Volley 是光滑的;我非常喜欢他们的可插拔后端传输,
    并可能最终放弃AndroidAsync。请求优先权
    和取消管理很棒(如果你使用网络)

  • Android-Universal-Image-Loader 是最受欢迎的人之一 目前。高度可定制。

  

该项目旨在为异步提供可重复使用的仪器   图像加载,缓存和显示。它最初基于Fedor   Vlasov的项目自那以后经过了大量的重构和改进   然后

考虑所有这些Android-Universal-Image-Loader套件您的要求(将图像加载到本地磁盘上)!