엔지니어링 업계를 위해 Android에 카탈로그 애플리케이션이 있습니다. Android 기기에 300,000 개가 넘는 디자인 이미지가 업로드되었습니다. 200 개가 넘는 새로운 이미지가 매일 기기에 동기화됩니다.수백 개의 이미지를 그리드에로드하는 동안 안드로이드 애플리케이션의 성능 문제가 발생했습니다.
디자인의 세부 사항이 저장되는 CatalogDetail 테이블이 있습니다. 서로 다른 속성과 두 개의 이미지 경로를 저장하기 위해 약 20 개의 열이 있습니다. 하나는 썸네일 용이고 다른 하나는 큰 이미지 용입니다. 썸네일 이미지의 평균 크기는 약 20KB이고 큰 이미지의 크기는 약 40KB입니다. 그리고이 모든 이미지는 데이터베이스가 아닌 동일한 폴더에 저장됩니다. 30 만 이미지의 전체 크기는 약 6GB입니다. 다양한 검색 조건에 따라 축소판 이미지와 간단한 설명이 응용 프로그램의 격자에 표시됩니다.
폴더에 5000 개의 이미지가있는 경우 응용 프로그램이 제대로 작동하고 데이터 크기가 커질수록 응용 프로그램의 속도가 느려지고 느려집니다. 현재 300,000 개의 이미지를로드 한 후 250 개의 이미지 (최종 사용자가 적어도 250 개의 이미지를 한 번에로드해야 함)를 그리드에로드하면 그리드로로드하는 속도가 비교적 느려지지만 스크롤하려고하면 상당히 많은 시간이 걸릴 것입니다. 장시간 (약 10-15 초), 바람직하지 않습니다.
SQL을 프로파일 링하여 SQL에 데이터를 가져 오는 데 상당한 시간 (1 초 미만)이 걸리지 않는다는 것을 알아 냈습니다. 마지막으로 폴더에서 이미지를로드하는 중 문제가 있음을 알아 냈습니다. 이미지는 내부 메모리에 저장됩니다. 이 응용 프로그램은 Android 3.1 (Honeycomb) OS, RAM 1GB 및 16GB 내부 메모리가있는 Samsung Galaxy Tab 750 10.1 인치에서 작동합니다. 응용 프로그램은 SDK 10을 사용하여 개발됩니다. 최종 사용자의 기본 요구 사항 중 하나는 디자인 이미지가 독점적이며 장치에서 복사해야한다는 것입니다. 따라서 이미지 폴더는 숨겨져 있으며 응용 프로그램 외부에서 액세스 할 수 없습니다.
어떻게 성능을 향상시킬 수 있는지 알려주십시오.
1. 이미지 색인이 있으면 성능이 향상 될 수 있습니까? 색인을 생성 할 수 있습니까? (소프트웨어, 응용 프로그램 등이 있습니까?
) 2. 각 폴더에 1000 개의 이미지를 저장하고 300 개의 폴더를 만들고 이미지에서 액세스 할 수 있다면 성능을 향상시킬 수 있습니까? ?하지만이 방법은 모든 이미지를 다시로드하고 테이블의 이미지 위치를 수정해야하므로 마지막 옵션이되어야합니다.
3. 스레딩 도움말이 있습니까? (스레딩을 모른다는 사실을 잘 알고 있습니다)
친절하게 내가 성능을 개선 할 수있는 방법을 나에게 제안
감사를 도와
검색 기능이 방법을 실행합니다 :..
,private void ShowData() {
try {
Cursor countc = dal.getCursor("Select count(*) From Product " + whereCondition);
SQL = "Select ID as _id, Name, Code, ProductWeight, '" + fileLoc + "' || ImageLoc as ImageLoc, ReleaseDate From CatalogDetail " + whereCondition;
Cursor c = dal.getCursor(SQL + " Order By " + orderByField + " " + OrderSeq);
ProductGridView.setAdapter(new CatalogueListAdapter(this, c));
} catch (Exception e) {
e.printStackTrace();
}
}
는이 카탈로그는 그리드에로드되는 방법입니다
자발적으로 그 경우 단순히 자신의 이름을 기준으로 하위 폴더에 사진을 배포하거나하는 것입니다 내 마음에 오는public class CatalogueListAdapter extends SimpleCursorAdapter {
private Context context;
private Cursor c;
public CatalogueListAdapter(Context context, Cursor c) {
super(context, R.layout.thumbnail, c, new String[] {}, new int[] {});
this.context = context;
this.c = c;
}
@Override
public View getView(int position, View inView, ViewGroup parent) {
View v = inView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.thumbnail, null);
}
c.moveToPosition(position);
ImageView ivThumb = (ImageView) v.findViewById(R.id.thumbnail);
String imageLoc = this.c.getString(this.c.getColumnIndex("ImageLoc"));
if (imageLoc != null)
ivThumb.setImageURI(Uri.parse(imageLoc));
return v;
}
}
@ Stack Stacker에게 감사드립니다. 나는 에뮬레이터에서 테스트 할 것을 찾고있다. :) – Nagesh
@Nagesh 어쩌면 성능을 죽이는 'open()'인지를 먼저 알 수 있지만, 느리게 움직일 확률은 거의 같다. –
open()을 사용하지 않고 게시물에 코드를 추가하고 편집했습니다. 그것을 확인하십시오. – Nagesh