2012-07-30 2 views
2

개체 데이터베이스를 만들었습니다. 이 객체들은 각각 stringsbitmaps 두 개를 포함합니다. getAllContacts() 데이터베이스를 호출 할 때 꽤 오랜 시간이 걸립니다. 나에게 문제는 아니지만 최종 사용자에게는 이것이 성가시다.SQLite 데이터베이스 속도 향상 android

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

Bitmaps 원래 높이와 너비의 1/8에 축소됩니다 어떤 : 나는 객체를로드 할 때 나는 말을 내 비트 맵이 옵션을 설정합니다. 하지만 여전히 50 개의 레코드를로드하고이를 ListView에 채우는 데 약 10-15 초가 걸립니다. 로드하려고하는 객체가 메모리에 있는지 확인할 수있는 방법이 있습니까 (paging)? 또는 사용자가 ListView의 항목 중 하나를 누를 때 비트 맵을로드 할 수 있습니까?

미리 감사드립니다.

답변

0

이 솔루션은 :

그래서, 결국 내 문제에 대한 해결책을 발견했다. 대신에 나는 getAllContact() 전화를 할 때 Bitmaps을 모두 얻는, 비트 맵의는 사용자가 내 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(...)에 대한 CustomAdapter의 setOnClickListener 방법에서 수행 무슨 일이있는 ListView의 행을 누를 때로드 방법 :

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; 
} 

이 예제가 다른 사람들에게 올바른 방향으로 정확하게 전달되기를 바랍니다.

2

샘플 크기를 설정했지만 여전히 큰 이미지를 읽고 있습니다. 비트 맵을 이미 작게 설정 한 다음 스케일 팩터를 적용하지 않고 작은 이미지를 읽을 수는 없습니까?

나는 비슷한 일을하는 내 자신의 코드에서 listView를 만들었고, 새로운 이미지가 생성 될 때마다 코드를 작성한 다음 작은 이미지 만 처리 할 때까지는 매우 느렸다. 그리고 그 코드는 영원히 행복하게 살았습니다.

+0

일부 알고리즘에 대해서는 Server-Side에서 전체 크기의 비트 맵이 필요하기 때문입니다. –

+0

풀 사이즈 버전과 작은 버전의 비트 맵을 만드는 것은 어떨까요? – ikh

+0

@ikh 의견을 보내 주셔서 감사합니다. 하지만 지금은 사용자가 목록보기의 항목을 누르면 이미지를로드하려고합니다. –