使用Async任务进行gridview图像加载

时间:2014-08-04 01:03:56

标签: java android

我一直在寻找解决方案几个小时,希望有人能帮忙吗?

我有一个滑动标签页面ui,每个页面都有一个加载图像的网格视图,按预期工作,但速度非常慢,即使在高端设备上也是如此。我可以使用异步任务设置图像资源吗?我的gridview的适配器如下:

public class PcAdapter extends BaseAdapter {
    private Context context;
    private Integer[] imageIds = {
            R.drawable.pcserioussam, R.drawable.pc_trinetwo,
            R.drawable.pc_leftfordead, R.drawable.pc_dungeondefenders,
            R.drawable.pc_portaltwo, R.drawable.pc_spaz,
            R.drawable.pc_laracroftattoo, R.drawable.pc_goatsim,
            R.drawable.pc_deadblock
    };

    public PcAdapter(Context c) {
        context = c;
    }

    public int getCount() {
        return imageIds.length;
    }

    public Object getItem(int position) {
        return imageIds[position];
    }

    public long getItemId(int position) {
        return 0;
    }

    public View getView(int position, View view, ViewGroup parent) {
        ImageView iview;
        if (view == null) {
            iview = new ImageView(context);
            iview.setLayoutParams(new GridView.LayoutParams(230,300));
//            iview.setScaleType(ImageView.ScaleType.FIT_CENTER);
            iview.setPadding(5, 5, 5, 5);
        } else {
            iview = (ImageView) view;
        }
        iview.setImageResource(imageIds[position]);
        return iview;
    }
}

2 个答案:

答案 0 :(得分:2)

由于以下几点,你的问题出现了:

  • 您正在使用异步任务与asyncTask.execute一次运行一个异步任务所以我建议你这个链接: Running multiple AsyncTasks at the same time -- not possible?
  • 您正在使用viewpager,如果您的gridview在片段viewpager中,当您加载当前标签页时,还会在其旁边加载两个标签,以便在点击其他标签时提高用户体验,而不是等待查看膨胀等等...所以你必须在选项卡内调用异步任务选择不在页面内选择并在onTabOnselected上取消它(你不能使viewpager设置为set.limitOffScreenPage(0);这不会工作,0被忽略。我强烈建议你使用库来下载图像因为这个任务需要很多提示和技巧才能获得流畅的用户体验,而且这本身就是另一个项目(不要重新发明轮子,如果其他人发明了你的话)。
  • 您正在UI线程上解码图像并一次解码一个
  • 您的互联网连接速度很慢
  • 您的图片尺寸很大
希望能帮到你!

答案 1 :(得分:2)

@mmlooloo的答案是完全相关的,我完全赞同他。

作为补充,为了给出一个解决方案,我建议你使用库Picasso,它真的很容易使用,非常强大。 在Adapter中,您可以将图片加载到ImageView中,如下所示:

// Trigger the download of the URL asynchronously into the image view.
Picasso.with(context)
.load(url) // url of your image
.placeholder(R.drawable.placeholder) // drawable to display while downloading the image
.error(R.drawable.error) // drawable in case of failure
.into(imageView); // ImageView where you want to load the picture.

Picasso将为您处理缓存和内存问题。 要了解有关毕加索的更多信息并开始使用它,take a look here