2

我创建了一个对象数据库。这些对象中的每一个都包含两个strings和两个bitmaps。当我getAllContacts()调用我的数据库时,加载需要很长时间。对我来说这不是问题,但对于最终用户来说,这会很烦人。当我加载一个对象时,我将此选项设置为我的位图:

  BitmapFactory.Options options=new BitmapFactory.Options();
  options.inSampleSize = 8;

这会将其缩小Bitmaps到原始高度和宽度的 1/8。但是,加载 50 条记录并将其填充到ListView. 有什么方法可以检查我尝试加载的对象是否在内存中,也称为paging?或者,当用户按下ListView?中的一项时,我可以加载位图。

提前致谢!

4

2 回答 2

2

您设置了样本大小,但它仍在读取(我假设)大图像。为什么不将您的位图设置为已经很小,然后您可以在不应用比例因子的情况下读取小图像?

我在自己的代码中有一个 listView 做类似的事情,它非常慢,直到我编写代码来缩小每个创建的新图像,然后总是只处理小图像。代码从此过着幸福的生活。

于 2012-07-30T12:52:30.250 回答
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; 
}

我希望这个例子能给其他人一个正确的方向。

于 2012-08-01T06:41:38.913 回答