Android 如何使用asyncTask从资源加载图像

Android 如何使用asyncTask从资源加载图像,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,在此自定义适配器中,在我的列表视图中只有一个imageview。我正在加载此listview中的图像列表。我想在asynctask中加载新图像,但我不知道如何实现asynctask,大多数教程都提到图像下载,但我使用的是可绘制资源,因此请指导我如何实现图像的异步加载以替换当前可见视图中的图像 class MyAdapter extends BaseAdapter { private Context context; private int images[]; publ

在此自定义适配器中,在我的列表视图中只有一个imageview。我正在加载此listview中的图像列表。我想在asynctask中加载新图像,但我不知道如何实现asynctask,大多数教程都提到图像下载,但我使用的是可绘制资源,因此请指导我如何实现图像的异步加载以替换当前可见视图中的图像

class MyAdapter extends BaseAdapter {

    private Context context;
    private int images[];

    public MyAdapter(Context context, int images[]) {
        this.context = context;
        this.images = images;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return images.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return images[position];
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    class MyViewHolder {
        ImageView imageView;

        public MyViewHolder(View v) {
            // TODO Auto-generated constructor stub
            imageView = (ImageView) v.findViewById(R.id.imgView);
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View row = convertView;
        MyViewHolder holder = null;
        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.custom_list, parent, false);

            holder = new MyViewHolder(row);
            row.setTag(holder);
        } else {
            holder = (MyViewHolder) row.getTag();
            row = convertView;
        }
        holder.imageView.setImageResource(images[position]);
        return row;
    }
}
这是我的主要活动,我正在调用MyAdapter以获取图像列表

public class MainActivity extends Activity {

    private ListView listView;
    private MyAdapter myAdapter;

    int[] images = { R.drawable.img001, R.drawable.img002, R.drawable.img003,
            R.drawable.img004, R.drawable.img005, R.drawable.img006,
            R.drawable.img007, R.drawable.img008, R.drawable.img009,
            R.drawable.img010, R.drawable.img011, R.drawable.img012,
            R.drawable.img013, R.drawable.img014, R.drawable.img015,
            R.drawable.img016, R.drawable.img017, R.drawable.img018,
            R.drawable.img019, R.drawable.img020, R.drawable.img021,
            R.drawable.img022, R.drawable.img023, R.drawable.img024,
            R.drawable.img025, R.drawable.img026, R.drawable.img027,
            R.drawable.img028, R.drawable.img029, R.drawable.img030,
            R.drawable.img031, R.drawable.img032, R.drawable.img033,
            R.drawable.img034, R.drawable.img035, R.drawable.img036,
            R.drawable.img037, R.drawable.img038, R.drawable.img039,
            R.drawable.img040, R.drawable.img041, R.drawable.img042,
            R.drawable.img043, R.drawable.img044, R.drawable.img045,
            R.drawable.img046, R.drawable.img047, R.drawable.img048,
            R.drawable.img049, R.drawable.img050, R.drawable.img051,
            R.drawable.img052, R.drawable.img053, R.drawable.img054,
            R.drawable.img055, R.drawable.img056, R.drawable.img057,
            R.drawable.img058, R.drawable.img059, R.drawable.img060,
            R.drawable.img061, R.drawable.img062, R.drawable.img063,
            R.drawable.img064, R.drawable.img065, R.drawable.img066,
            R.drawable.img067, R.drawable.img068, R.drawable.img069,
            R.drawable.img070, R.drawable.img071, R.drawable.img072,
            R.drawable.img073, R.drawable.img074, R.drawable.img075,
            R.drawable.img076, R.drawable.img077, R.drawable.img078,
            R.drawable.img079, R.drawable.img080, R.drawable.img081,
            R.drawable.img082, R.drawable.img083, R.drawable.img084,
            R.drawable.img085, R.drawable.img086, R.drawable.img087,
            R.drawable.img088, R.drawable.img089, R.drawable.img090,
            R.drawable.img091, R.drawable.img092, R.drawable.img093,
            R.drawable.img094, R.drawable.img095, R.drawable.img096,
            R.drawable.img097, R.drawable.img098, R.drawable.img099,
            R.drawable.img100 };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
        myAdapter = new MyAdapter(this, images);
        listView = (ListView) findViewById(R.id.imgList);
        listView.setAdapter(myAdapter);
    }
  }
依赖项{
编译'com.squareup.picasso:picasso:2.3.2'
}
毕加索.with(context).load(R.drawable.)进入(holder.imageView);

这里有一个完整的例子:

这正是你需要的。但如果你开始使用Android,这段代码真的很难理解。更好的建议是使用库进行此操作,有以下几种选择:

  • (事实标准)

为什么要使用asynctasks“加载”已在资源上的绘图?因为解码位图需要时间并冻结UI线程@Pedro Oliveirai使用了这条语句,但它在日志和应用程序崩溃中给出了以下错误“3318016字节分配的内存不足”。如果您知道图片的屏幕尺寸,您可以调整图片的大小
Picasso.with().load().resize(,).into()或自动缩放它
Picasso.with().load().fit().into()
它仍然会给出相同的错误u plz能否准确地描述我应该在上面的自定义适配器中调用此语句的位置?而不是直接设置映像
holder.imageView.setImageResource(映像[position]),替换为建议的代码。是的,你是rite,在UI线程下处理位图确实很难理解,但我仍然想使用它,请你指导我如何在上面的代码上实现它。
dependencies {
    compile 'com.squareup.picasso:picasso:2.3.2'
}

Picasso.with(context).load(R.drawable.<id>).into(holder.imageView);