android-如何缓存图像并离线显示?

android-如何缓存图像并离线显示?,android,json,sqlite,caching,Android,Json,Sqlite,Caching,我正在Web服务中使用Volley API,然后我将使用SQLITE编写数据 带有JSON和许多iTen的Web服务,每个都有数据和图像,我需要将此图像保存在缓存中,以便在ListView中脱机显示,然后在详细信息屏幕上显示。在未来,用户将清理这些iTen,并清理它们的图像 那么,如何将这些图像保存在本地数据库中,并与JSON中的每个项目进行链接呢 90%的时间里,我都会离线。我只会在线同步并下载更新的服务器项目 您可以使用Android通用图像加载器,它还可以在内存中缓存图像。下次使用imag

我正在Web服务中使用Volley API,然后我将使用SQLITE编写数据

带有JSON和许多iTen的Web服务,每个都有数据和图像,我需要将此图像保存在缓存中,以便在ListView中脱机显示,然后在详细信息屏幕上显示。在未来,用户将清理这些iTen,并清理它们的图像

那么,如何将这些图像保存在本地数据库中,并与JSON中的每个项目进行链接呢


90%的时间里,我都会离线。我只会在线同步并下载更新的服务器项目

您可以使用Android通用图像加载器,它还可以在内存中缓存图像。下次使用imageloader中用于获取图像的相同url时,它将从缓存中显示

请参阅下面的链接,以获取通用图像加载器示例的完整源代码


您可以使用Android Universal Image Loader,它还可以在内存中缓存图像。下次使用imageloader中用于获取图像的相同url时,它将从缓存中显示

请参阅下面的链接,以获取通用图像加载器示例的完整源代码


在Android中处理图像的基准是使用库。它负责:

  • 在适配器中处理ImageView回收和下载取消
  • 使用最少内存的复杂图像转换
  • 自动内存和磁盘缓存
此外,如果您要在列表中显示图像并需要动画来增强UI,我强烈建议您将ListView更改为RecyclerView不建议将图像存储在DB中,将图像从/转换为BLOB会浪费时间(选中并单击)。尽管如此,我的建议是:

  • 使用毕加索从JSON中提供的URL加载图像
  • 实现一个自定义目标来处理毕加索下载的图像文件
  • 将图像保存在应用程序目录中的文件夹中
  • 使用RecyclerView显示图像;(可选)
  • 如果您需要完成这些工作的项目示例,您可以检查。在这个项目中,我遵循上面描述的方法。您可以从商店下载应用程序,并查看它将如何下载图像

    快速指南:
  • 要使用毕加索,请将其添加到模块的gradle文件中:
    compile'com.squareup.Picasso:Picasso:2.5.2'

  • 创建一个实现
    import com.squareup.picasso.Callback的类

    公共类ImageWarehouse实现回调{ 私有静态最终字符串TAG=“ImageWarehouse”

    私有字符串mDirectory;
    私有字符串mFileName;
    私有ImageView mContainer;
    @注入
    应用程序地图应用;
    公共ImageWarehouse(字符串文件名、ImageView容器、字符串目录){
    this.mFileName=文件名;
    this.mContainer=容器;
    this.mDirectory=目录;
    这是getStorageDir();
    }
    @凌驾
    成功时的公共无效(){
    if(this.isexternalstoragewriteable()){
    最终位图位图=((BitmapDrawable)this.mContainer.getDrawable()).getBitmap();
    新建异步任务(){
    @凌驾
    受保护的文件doInBackground(Void…params){
    File=null;
    试一试{
    file=新文件(ImageWarehouse.this.getStorageDir().getPath().concat(“/”).concat(ImageWarehouse.this.mFileName.concat(Constants.MEDIA_扩展名));
    createNewFile();
    FileOutputStream ostream=新的FileOutputStream(文件);
    compress(bitmap.CompressFormat.JPEG,100,ostream);
    ostream.close();
    }捕获(例外e){
    Log.e(标签“外部存储不可用”);
    }
    返回文件;
    }
    }.execute();
    }否则{
    Log.e(标签“外部存储不可用”);
    }
    }
    @凌驾
    公开无效{
    }
    公共布尔值isExternalStorageWritable(){
    String state=Environment.getExternalStorageState();
    if(环境、介质、安装等于(状态)){
    返回true;
    }
    返回false;
    }
    公共文件getStorageDir(){
    File File=新文件(Environment.getExternalStorageDirectory(),Constants.MEDIA_DIRECTORY.concat(this.mDirectory));
    如果(!file.mkdirs()){
    }
    返回文件;
    }
    
    }

  • 调用毕加索以在布局中显示图像并将其保存到指定路径:

    毕加索 .load(URL) .fit() .centerCrop() .插入(视图支架.盖, 新影像仓库( 名称 viewHolder.cover, 常数.MEDIA\u字符 ) );


  • 在Android中处理图像的基准是使用库。它负责:

    • 在适配器中处理ImageView回收和下载取消
    • 使用最少内存的复杂图像转换
    • 自动内存和磁盘缓存
    此外,如果您要在列表中显示图像并需要动画来增强UI,我强烈建议您将ListView更改为RecyclerView不建议将图像存储在DB中,将图像从/转换为BLOB会浪费时间(选中并单击)。尽管如此,我的建议是:

  • 使用毕加索从JSON中提供的URL加载图像
  • 实现一个自定义目标来处理毕加索下载的图像文件
  • 将图像保存在应用程序目录中的文件夹中
  • 使用RecyclerView显示图像;(可选)
  • 如果您需要完成这些工作的项目示例,您可以检查。在这个项目中,我遵循上面描述的方法。您可以从商店下载应用程序,并查看它将如何下载图像

    快速指南:
  • 要使用毕加索,请添加以下内容
    private String mDirectory;
    private String mFileName;
    private ImageView mContainer;
    @Inject
    App mApplication;
    
    public ImageWarehouse(String fileName, ImageView container, String directory) {
        this.mFileName = fileName;
        this.mContainer = container;
        this.mDirectory = directory;
        this.getStorageDir();
    }
    
    @Override
    public void onSuccess() {
        if (this.isExternalStorageWritable()) {
            final Bitmap bitmap = ((BitmapDrawable) this.mContainer.getDrawable()).getBitmap();
            new AsyncTask<Void, Void, File>() {
                @Override
                protected File doInBackground(Void... params) {
                    File file = null;
                    try {
                        file = new File(ImageWarehouse.this.getStorageDir().getPath().concat("/").concat(ImageWarehouse.this.mFileName.concat(Constants.MEDIA_EXTENSION)));
                        file.createNewFile();
                        FileOutputStream ostream = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
                        ostream.close();
                    } catch (Exception e) {
                        Log.e(TAG, "External Storage is not available");
                    }
                    return file;
                }
            }.execute();
        } else {
            Log.e(TAG, "External Storage is not available");
        }
    }
    
    @Override
    public void onError() {
    
    }
    
    public boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        }
        return false;
    }
    
    public File getStorageDir() {
        File file = new File(Environment.getExternalStorageDirectory(), Constants.MEDIA_DIRECTORY.concat(this.mDirectory));
        if (!file.mkdirs()) {
        }
        return file;
    }
    
    create table sometable(id integer primary key autoincrement,photo BLOB);
    
    //convert image into byte[]
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.common)).getBitmap();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);   
    byte[] photo = baos.toByteArray();
    
    //And now store this image
    ContentValues initialValues = new ContentValues();   
    initialValues.put("photo",photo);
    return db.insert("sometable", null, initialValues);
    
    Cursor cur=your query;
    while(cur.moveToNext())
    {
       byte[] photo=cur.getBlob(index of blob cloumn);
    }