我创建了一个对象数据库。这些对象中的每一个都包含两个strings
和两个bitmaps
。当我对我的数据库进行getAllContacts()
调用时,加载需要很长时间。对我来说这不是问题,但对于最终用户来说,这会很烦人。当我加载一个对象时,我将这个选项设置为我的位图:
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;
将Bitmaps
缩小到原始高度和宽度的1/8。但是,加载50条记录并将其填入ListView
大约需要10-15秒。有什么方法可以检查我尝试加载的对象是否在内存中,也称为paging
?或者,当用户按下ListView
中的某个项目时,我可以加载位图?
提前致谢!
答案 0 :(得分:2)
您设置了样本大小,但它仍在阅读(我假设)大图像。为什么不设置位图以使它们已经很小然后你可以读取没有应用比例因子的小图像?
我在自己的代码中有一个listView做类似的事情,直到我编写代码来缩小每个新图像时才开始缩小,然后总是处理小图像。而且代码从此过上了幸福。
答案 1 :(得分:0)
解决方案:
所以,最后我找到了解决问题的方法。当我进行Bitmaps
调用时,不会获取所有getAllContact()
,而是在用户按下ListView
中的行时加载位图。这是在setOnClickListener
中完成的CustomAdapter中我的ListView
String PCN = cases.get(position).getCaseNumber();
int tempPCN = Integer.valueOf(PCN);
tempBitMapArray = dbHandler.getFinger(tempPCN);
Bitmap left = tempBitMapArray[0];
Bitmap right = tempBitMapArray[1];
ByteArrayOutputStream bs1 = new ByteArrayOutputStream();
left.compress(Bitmap.CompressFormat.PNG, 100, bs1);
ByteArrayOutputStream bs2 = new ByteArrayOutputStream();
right.compress(Bitmap.CompressFormat.PNG, 100, bs2);
getFinger(...)
方法:
public Bitmap[] getFinger(int pcn) {
Bitmap[] fingers = new Bitmap[2];
String SQLQUERY = "SELECT " + RIGHTFINGER + ", " + LEFTFINGER +" FROM " + TABLE_CASES + " WHERE " + KEY_ID + "=" + pcn + ";";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(SQLQUERY, null);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 2;
if (cursor.moveToFirst()) {
do {
byte[] blob1 = cursor.getBlob(cursor.getColumnIndexOrThrow("leftFinger"));
Bitmap bmp1 = BitmapFactory.decodeByteArray(blob1, 0, blob1.length, options);
byte[] blob2 = cursor.getBlob(cursor.getColumnIndexOrThrow("rightFinger"));
Bitmap bmp2 = BitmapFactory.decodeByteArray(blob2, 0, blob2.length, options);
fingers[0] = bmp1;
fingers[1] = bmp2;
return fingers;
} while(cursor.moveToNext());
}
return null;
}
我希望这个例子可以让其他人在正确的方向上找到一个精确的点。