
import java.io.IOException;import java.util.ArrayList;import androID.app.Activity;import androID.content.Context;import androID.content.Intent;import androID.database.Cursor;import androID.graphics.Bitmap;import androID.graphics.BitmapFactory;import androID.graphics.drawable.BitmapDrawable;import androID.net.Uri;import androID.os.AsyncTask;import androID.os.Bundle;import androID.os.DeBUG;import androID.os.Environment;import androID.provIDer.MediaStore;import androID.vIEw.display;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.vIEw.Window;import androID.vIEw.WindowManager;import androID.Widget.AdapterVIEw;import androID.Widget.BaseAdapter;import androID.Widget.GrIDVIEw;import androID.Widget.ImageVIEw;import androID.Widget.Toast;import androID.Widget.AdapterVIEw.OnItemClickListener;public class Wallpaper extends Activity implements OnItemClickListener{/*Instance variables*/ private GrIDVIEw grID; private ImageAdapter imageAdapter; private display display; Cursor cursor; boolean inInternalStorage = false; public voID onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); requestwindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentVIEw(R.layout.wallpaper_images); display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultdisplay(); setupVIEws(); setProgressbarIndeterminateVisibility(true); loadImages(); } @OverrIDe protected voID onStop(){ super.onStop(); } /*methods called from AsyncTask as appropriate when its querying and processing the images from the MediaStore*/ private voID loadImages() { final Object data = getLastNonConfigurationInstance(); if(data == null){ new LoadImagesFromSDCard().execute(); }else { final LoadedImage[] photos = (LoadedImage[])data; if(photos.length == 0){ new LoadImagesFromSDCard().execute(); } for(LoadedImage photo:photos){ addImage(photo); } }}private voID addImage(LoadedImage... value) { for(LoadedImage photo: value){ imageAdapter.addPhotos(photo); imageAdapter.notifyDataSetChanged(); }}private voID setupVIEws() { grID = (GrIDVIEw)findVIEwByID(R.ID.grIDvIEw); grID.setNumColumns(display.getWIDth()/95); grID.setClipTopadding(false); imageAdapter = new ImageAdapter(getApplicationContext()); grID.setAdapter(imageAdapter); grID.setonItemClickListener(this);}protected voID onDestroy() { super.onDestroy(); final GrIDVIEw grIDvIEw = grID; final int count = grID.getChildCount(); ImageVIEw v = null; for (int i = 0; i < count; i++) { v = (ImageVIEw) grID.getChildAt(i); ((BitmapDrawable) v.getDrawable()).setCallback(null); } unbindDrawables(findVIEwByID(R.ID.grIDvIEw)); System.gc(); }/*public Object onRetainNonConfigurationInstance(){ final GrIDVIEw grIDvIEw = grID; final int count = grID.getChildCount(); final LoadedImage[] List = new LoadedImage[count]; for(int i = 0; i < count; i++){ final ImageVIEw v = (ImageVIEw)grID.getChildAt(i); List[i] = new LoadedImage(((BitmapDrawable) v.getDrawable()).getBitmap()); } return List;}*//*utility method called that prevents screen from crashing when screen orIEntation changes*/private voID unbindDrawables(VIEw vIEw){ if(vIEw.getBackground() != null){ vIEw.getBackground().setCallback(null); } if(vIEw instanceof VIEwGroup){ for(int i = 0; i < ((VIEwGroup) vIEw).getChildCount(); i++){ unbindDrawables(((VIEwGroup)vIEw).getChildAt(i)); } try{ ((VIEwGroup)vIEw).removeAllVIEws(); }catch(Exception e){ e.printstacktrace(); } }}/*AsyncTask thats querIEs the MediaStore for images and creates thumbnail images from bitmaps*/class LoadImagesFromSDCard extends AsyncTask<Object,LoadedImage,Object> { @OverrIDe protected Object doInBackground(Object... params) { Cursor cursor; Bitmap bitmap = null; Bitmap newbitmap = null; Uri uri = null; String [] img = {MediaStore.Images.Media._ID}; String state = Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(state)){ cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,img,MediaStore.Images.Media.DATA + " like ? ",new String[]{ "%dcim%"},null); } else { cursor = getContentResolver().query(MediaStore.Images.Media.INTERNAL_CONTENT_URI,null,null); inInternalStorage = true; } int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); int size = cursor.getCount(); if(size == 0){ Toast.makeText(getApplicationContext(),"There are no Images on the sdcard",Toast.LENGTH_SHORT).show(); }else { } for(int i = 0; i < size; i++){ cursor.movetoposition(i); int ImageID = cursor.getInt(column_index); if(inInternalStorage == true){ uri = Uri.withAppendedpath(MediaStore.Images.Media.INTERNAL_CONTENT_URI,"" + ImageID); }else { uri = Uri.withAppendedpath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"" + ImageID); } try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize=4; bitmap = BitmapFactory.decodeStream(getContentResolver().openinputStream(uri),options); if(bitmap != null){ newbitmap = Bitmap.createScaledBitmap(bitmap,100,true); bitmap.recycle(); } if(newbitmap != null){ publishProgress(new LoadedImage(newbitmap)); } }catch(IOException e){ } } cursor.close(); return null; } @OverrIDe public voID onProgressUpdate(LoadedImage... value){ addImage(value); } @OverrIDe protected voID onPostExecute(Object result) { setProgressbarIndeterminateVisibility(false); }}private static class LoadedImage { Bitmap mBitmap; LoadedImage(Bitmap bitmap) { mBitmap = bitmap; } public Bitmap getBitmap() { return mBitmap; }}/*Image Adapter to populate grID vIEw of images*/public class ImageAdapter extends BaseAdapter { private Context mContext; private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>(); public ImageAdapter(Context context){ this.mContext = context; } public voID addPhotos(LoadedImage photo){ photos.add(photo); } @OverrIDe public int getCount() { return photos.size(); } @OverrIDe public Object getItem(int position) { return position; } @OverrIDe public long getItemID(int position) { return position; } @OverrIDe public VIEw getVIEw(int position,VIEw convertVIEw,VIEwGroup parent) { System.gc(); ImageVIEw image; VIEwHolder holder; if(convertVIEw == null){ LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertVIEw = inflater.inflate(R.layout.image_List,null); holder = new VIEwHolder(); holder.image = (ImageVIEw)convertVIEw.findVIEwByID(R.ID.image_List_ID); convertVIEw.setTag(holder); } else{ holder = (VIEwHolder)convertVIEw.getTag(); } holder.image.setLayoutParams(new GrIDVIEw.LayoutParams(100,100)); holder.image.setimageBitmap(photos.get(position).getBitmap()); return convertVIEw; }}static class VIEwHolder { ImageVIEw image;}@OverrIDepublic voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,long ID) { Cursor cursor = null; int image_column_index = 0; String[] proj = {MediaStore.Images.Media.DATA}; String state = Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(state)){ cursor = managedquery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,proj,new String[]{"%dcim%"},null); }else{ cursor = managedquery(MediaStore.Images.Media.INTERNAL_CONTENT_URI,null); } cursor.movetoposition(position); image_column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); String info = cursor.getString(image_column_index); Intent imagevIEwer = new Intent(getApplicationContext(),VIEwImage.class); imagevIEwer.putExtra("pic_name",info); startActivity(imagevIEwer);}} 我认为我所追求的是一种允许dobackground()在调用publishProgress()之前运行一段时间的方法.就像androID中的图库应用程序一样.
关于为什么这可能会很慢或如何解决这个问题的任何想法将非常感激,因为我一直坚持如何提高性能一段时间.
>首先加载大约18张图像(正如你所说,显示之前的预缓冲).检查以确保图像数量不超过您选择的任何数字.
>创建一个’thumbs.db’类型文件,该文件将存储位图的100×100像素缩略图.这将允许更快的读取,因为您只需要读取一个文件然后提取每个位图.如果用户单击图像,则从存储中请求它.此方法需要更多工作,但能够非常快速地加载缩略图.您可能必须设计自己的简单文件头,例如:
<file header (size of file,number of images)> <image header (img ID,size in bytes)> <image bitmap data> <image header (img ID,size in bytes)> <image bitmap data> ...@H_419_4@ @H_419_4@ @H_419_4@ @H_419_4@ 总结
以上是内存溢出为你收集整理的android – 使用AsyncTask填充图像的gridview时慢速滚动全部内容,希望文章能够帮你解决android – 使用AsyncTask填充图像的gridview时慢速滚动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)