android – 在网格视图中显示图像的最佳方式是滚动平滑

前端之家收集整理的这篇文章主要介绍了android – 在网格视图中显示图像的最佳方式是滚动平滑前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先,我已经做了很少的事情来在gridview中显示图像,使滚动时变得平滑

1.从背景线程上的互联网加载图像

AsyncTask acyncTask ;
HandlerThread handlerThread ;

 URL imageUrl = new URL(link);

2.将位图设置为样本大小以节省内存

final BitmapFactory.Options option = new BitmapFactory.Options();
    option.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(mFile.getPath(),option);
    option.inSampleSize = calculateInSampleSize(option,mSize,mSize);
    option.inJustDecodeBounds = false;
    option.inPurgeable = true ;
    option.inDither = false ;
    option.inScaled = false ;
    option.inPreferredConfig = Bitmap.Config.ARGB_8888;

3.制作缓存以保存解码的位图

LruCache lruCache = new LruCache

在baseadapter getView();
我将lruCache.get(key)取得解码后的位图

4.通过处理程序解码位图时的延迟加载

 Handler handler = new Handler();
        handler.post(new Runnable(){
           public void run(){
              imageView.setimageBitmap(bitmap);
          }
      });

现在我面临一个大问题,当我滚动时它仍然有点滞后
我有谷歌的东西可以使滚动更好,不知道真的有什么可以改善或问题出来的地方我检查每个getView()只花我约2~6毫秒它会调用我的代码异步加载图像表单工作线程,所以我真的不知道为什么有些应用程序可以加载非常流畅?我的情况是当滚动屏幕看起来不是很顺利是否有一些建议可以适用?

编辑:当我滚动时,在缓存中找到位图并在屏幕上显示,如果我快速滚动,它看起来就像没有滚动到足以显示图像,它会使我的滚动不那么顺利,即使我有缓存下来缓存中的位图

这是适配器代码

if (convertView == null) {
        convertView = layoutInflater.inflate(
                R.layout.row_display_image_grid,null);
        viewHolder = new DisplayImageGridViewHolder();
        viewHolder.background = (RelativeLayout) convertView
                .findViewById(R.id.background);
        viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
        viewHolder.text = (TextView) convertView.findViewById(R.id.text);
        viewHolder.position = position;
        viewHolder.text.setEllipsize(TruncateAt.END);
        viewHolder.text.setTypeface(typeFace);
        viewHolder.image.setOnClickListener(this);
        viewHolder.image.setOnLongClickListener(this);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (DisplayImageGridViewHolder) convertView.getTag();
    }

viewHolder.position = position;
imageLoader.loadImage(imageLinkList.get(position),viewHolder.image);
return convertView;
最佳答案
下面是我使用的LazyLoader的示例.注意我使用SoftReferences作为位图,现在使用LruCache可以更好地服务.

这将从web / sdcard / memory异步加载图像,并从占位符图像创建淡入效果.

public class ImageLoader {

private static MemoryCacheNew memoryCache=new MemoryCacheNew();
private static FileCache fileCache;

private static BitmapFactory.Options bitmapOptions;

private static int mInSampleSize;



public ImageLoader(Context context,int inSampleSize){


    fileCache=new FileCache(context);        

    context = null;

    bitmapOptions = new BitmapFactory.Options();
    bitmapOptions.inSampleSize = mInSampleSize = inSampleSize;
    bitmapOptions.inPreferredConfig = Config.RGB_565;
    bitmapOptions.inInputShareable = true;
    bitmapOptions.inDither = false;

}

final static int PLACEHOLDER_IMAGE = R.drawable.store_placeholder;

public void DisplayImage(String url,ImageView imageView,boolean checkTags){

    try{

    new AsyncPhotoTask(imageView,url,checkTags).execute();

    }catch(Exception e){
        e.printStackTrace();
    }

}

public void DisplayImage(String url,ImageView imageView)
{
      DisplayImage(url,imageView,true); 

}


private static Bitmap getBitmap(String url) 
{
    File f=fileCache.getFile(url);


    if(f!= null){
    //from SD cache
    Bitmap b = decodeFile(f);
    if(b!=null)
        return b;
    }

    //from web
    try {
        Bitmap bitmap=null;

        URL imageUrl;

            imageUrl = new URL(url);


        HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        InputStream is=conn.getInputStream();
        OutputStream os = new FileOutputStream(f);
        Utils.CopyStream(is,os);
        is.close();
        os.close();
        bitmap = decodeFile(f);
        return bitmap;
    } catch (Exception ex){
       ex.printStackTrace();
       return null;
    }
}

//decodes image and scales it to reduce memory consumption
private static Bitmap decodeFile(File f){
    try {
        return BitmapFactory.decodeStream(new FileInputStream(f),null,bitmapOptions);

    } catch (FileNotFoundException e) {

    } catch (OutOfMemoryError err){
        System.gc();
    } 

    return null;
}


private static class AsyncPhotoLoad extends AsyncTask

你这样称呼它:

imageLoader.DisplayImage(url,holder.image);

猜你在找的Android相关文章