Android - SimpleCursorAdapter加载慢图像

时间:2017-09-27 08:37:05

标签: android sqlite android-cursoradapter

我从我的SQLite数据库中获取存储为BLOB的图像,并使用SimpleCursorAdapter将Cursor设置为Adapter:

public class FragmentAdapter3 extends Fragment {
ArrayList<Sudentdb> list;
GridView gridView;

final String[] from = new String[]{SQLiteHelper._ID,
        SQLiteHelper.NAME, SQLiteHelper.AGE, "imagepath"};

final int[] to = new int[]{R.id.rowid, R.id.txtName, R.id.txtAge, R.id.img};

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_main_adapter3, null);
    gridView = (GridView) v.findViewById(R.id.gridView);
    empty = (TextView) v.findViewById(R.id.esc);

    final DBManager dbManager = new DBManager(getActivity());
    dbManager.open();

    final Cursor cursor = dbManager.fetch();

    list = new ArrayList<>();

    gridView.setAdapter(new SimpleCursorAdapter(getActivity(), R.layout.single_item, cursor, from, to, 0));     

    return v;
}

这很好用,我从SQLite获取所有文本和图像,问题是图像加载非常缓慢,这导致我的应用程序在活动之间切换时“滞后”。

我的问题是,我如何使用SimpleCursorAdapter从我的SQLite数据库加载图像,而不会在活动之间切换时导致滞后/加载问题?

编辑:

我知道我可以使用像Piccaso,UniversalImageLoader或Volley这样的库,可以为我处理图像的缓存,但我不知道如何使用上面的String[]来实现它。

编辑2:

我现在正在保存并获取图像的路径,就像建议的注释一样,但同样的问题也会出现。日志中唯一发生的事情是:

Skipped 43 frames! The application may be doing too much work on its main thread.

这向我表明,即使将保存BLOB更改为保存文件路径,也是导致此问题的图像加载。

1 个答案:

答案 0 :(得分:1)

尝试使用Picasso和Glide库,并在数据库存储图像中将varhar作为字符串路径,并使用Bitmap调用android端,以便在活动之间切换时应用程序不会“滞后”

毕加索

Picasso.with(mContext).load(imageFile).priority(Picasso.Priority.HIGH).resize(width, height).into(image);

滑翔

Glide.with(mContext).load(imageFile).override(width, height).into(image);

您可以将图像转换为PNG或JPEG,如下所示:

try {
   FileOutputStream out = new FileOutputStream(filename);
   bmp.compress(Bitmap.CompressFormat.PNG, 100, out); //100-best quality
   out.close();
} catch (Exception e) {
   e.printStackTrace();
}