내 앱이 한 곳에서 너무 느리게 실행 중입니다. 앱의 나머지 4 가지 활동은 합리적으로 빠르지 만 활동 중 하나는 너무 느려서 편안함을 느끼지 못합니다. 주 활동에서 버튼을 누르면 각보기에서 이미지와 텍스트로 채워지는 gridView로 다음 활동을 시작합니다. 버튼을 누르고 나면 gridView로드 페이지가 나타나기까지 3 ~ 5 초 정도 걸리므로 너무 오래 걸립니다.커서 동작 및 이미지로드가 많은 느린 앱 속도 향상
ZTE에서 만든 다양한 저속 600mhz 단일 코어 프로세서 안드로이드 전화에서의 테스트. 남아프리카 사막의 칼라 하리 부시 맨 (Callahari Bushmen)과 같은 사람들이 사용하는 저비용 전화 중 하나. 알고 있지 않은 사람들은 삼성 갤럭시 S3 나 아이폰 5와 같은 등급이 아니라고 말하는 것은 삼가면서 말하는 것입니다.
나는 천천히 달리기에서 코드를 할 수 있는지 궁금합니다. 애플 리케이션의 일부는 속도에 대한 엉덩이에 차기를 제공합니다. 어떤 아이디어? 필자가 볼 수있는 유일한 점은 여러 커서와 데이터베이스 쿼리를 광범위하게 사용하면 속도가 느려질 수 있다는 것입니다. GridView를 로딩하는 것이 심각한 jigaboo를 차지한다고 생각합니다.
내 코드가 엉망이지만, 내가 할 수있는 것이 있는지 궁금합니다. 별도의 스레드에서 모든 콘텐츠 공급자 쿼리 내용을 처리하는 방법은 어떻습니까? 어떤 아이디어? 이 코드는 enima가 필요합니다.
아래 코드는 앱 속도를 저하시키는 부분입니다.
private void init_phone_image_grid() {
String[] img = { MediaStore.Images.Media._ID };
imagecursor = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, img, MediaStore.Images.Media.IS_PRIVATE + "='" + 1 +"'",null, MediaStore.Images.Media._ID);
image_column_index = imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
count = imagecursor.getCount();
imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
imagegrid.setAdapter(new ImageAdapter(getApplicationContext()));
imagegrid.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v,int position, long id) {
System.gc();
String[] img = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE };
imagecursor = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, img, MediaStore.Images.Media.IS_PRIVATE + "='" + 1 +"'",null, MediaStore.Images.Media._ID);
image_column_index = imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
count = imagecursor.getCount();
imagecursor.moveToPosition(position);
// String[] proj = { };
// imagecursor = managedQuery(
// MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,null, null, null);
// image_column_index = imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
String i = imagecursor.getString(image_column_index);
// terra = i;
// opens larger pic Intent intent = new Intent(getApplicationContext(), ViewImage.class);
/* intent.putExtra("filename", i);
startActivity(intent); */
// passing bitmap image to another activiy and starting that activity
// textone.setText(i); (i == /mnt/sdcard/DCIM/pic06.png)
Intent intentBitmapStart = new Intent(ImageThumbnailsActivity.this, Editor.class);
intentBitmapStart.putExtra("filename", i);
startActivity(intentBitmapStart);
// Intent myIntent = new Intent(ImageThumbnailsActivity.this, Editor.class);
// ImageThumbnailsActivity.this.startActivity(myIntent);
}
});
}
여기는 어댑터 메소드의 getview 섹션입니다.
public View getView(int position,View convertView,ViewGroup parent) {
System.gc();
if (convertView == null) {
// Make up a new view
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.image_item, null);
} else {
// Use convertView if it is available
view = convertView;
}
PanoramioItem s = mImageManager.get(position);
ImageView i = (ImageView) view.findViewById(R.id.image);
i.setImageBitmap(s.getBitmap());
i.setBackgroundResource(R.drawable.picture_frame);
TextView t = (TextView) view.findViewById(R.id.title);
t.setText(s.getTitle());
t = (TextView) view.findViewById(R.id.owner);
t.setText(s.getOwner());
return view;
}
View view;
ImageView iv = new ImageView(mContext.getApplicationContext());
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.activity_adapterview, null);
} else {
// Use convertView if it is available
view = convertView;
}
// Toast.makeText(ImageThumbnailsActivity.this, "image_column_index2: " + image_column_index, Toast.LENGTH_SHORT).show();
imagecursor.moveToPosition(position);
int id = imagecursor.getInt(image_column_index);
Uri uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ""+ id);
String imagePath = getRealPathFromURI(uri);
String[] titleText = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE };
textcursor = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, titleText, MediaStore.Images.Media.DATA + "='" + imagePath +"'",null, null);
if(textcursor.moveToFirst()){
titleString = (String) textcursor.getString(textcursor.getColumnIndex(MediaStore.Images.Media.TITLE));
textcursor.close();
}
else{
titleString = "";
}
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inJustDecodeBounds = true;
Bitmap bm = BitmapFactory.decodeFile(imagePath, bfo);
int imageHeight = bfo.outHeight;
int imageWidth = bfo.outWidth;
String imageType = bfo.outMimeType;
BitmapFactory.Options bfo2 = new BitmapFactory.Options();
int reqHeight = 50;
int reqWidth = 50;
if (imageHeight > reqHeight || imageWidth > reqWidth) {
if (imageWidth > imageHeight) {
bfo2.inSampleSize = Math.round((float)imageHeight/(float)reqHeight);
} else {
bfo2.inSampleSize = Math.round((float)imageWidth/(float)reqWidth);
}
}
Bitmap bm2 = BitmapFactory.decodeFile(imagePath, bfo2);
// iv.setImageBitmap(bm2);
ImageView i = (ImageView) view.findViewById(R.id.adapterimageview);
i.setImageBitmap(bm2);
TextView t = (TextView) view.findViewById(R.id.adaptertextview);
t.setText(titleString);
// iv.setImageURI(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ""+ id));
view.setLayoutParams(new GridView.LayoutParams(103, 103));
return view;
}
감사합니다. 지금부터 로더를 사용하여 확인해 보겠습니다. 전에는 그렇게 생각하지 않았습니다. – Kevik
@Kevik, 천만에. 오, 여기 또 다른 인기있는 게시물이 있습니다. 조금 오래되었지만 그럼에도 불구하고 매우 도움이됩니다. http://android-developers.blogspot.com/2009/05/painless-threading.html – Egor