android – 使用AsyncTask填充图像的gridview时慢速滚动

android – 使用AsyncTask填充图像的gridview时慢速滚动,第1张

概述美好的一天,我在这里遇到了一些问题.我正在使用和异步任务来显示来自外部或内部存储的图像.现在它可以工作,但问题是,它在滚动时非常缓慢且略微不稳定.我不知道为什么?请任何解决方案或想法如何做到这一点. import java.io.IOException;import java.util.ArrayList;import android.app.Activity;import android @H_419_4@ 美好的一天,我在这里遇到了一些问题.我正在使用和异步任务来显示来自外部或内部存储的图像.现在它可以工作,但问题是,它在滚动时非常缓慢且略微不稳定.我不知道为什么?请任何解决方案或想法如何做到这一点.

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中的图库应用程序一样.
关于为什么这可能会很慢或如何解决这个问题的任何想法将非常感激,因为我一直坚持如何提高性能一段时间.

@H_419_4@解决方法 最大的瓶颈是从设备(内部或外部)访问图像.因此,您需要在内存中拥有尽可能多的图像(理所当然).您可以通过多种方式执行此 *** 作:

>首先加载大约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时慢速滚动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1124339.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存