【问题标题】:Call to AsyncTask from custom adapter从自定义适配器调用 AsyncTask
【发布时间】:2018-12-17 10:28:23
【问题描述】:

我创建了一个带有自定义适配器的列表视图。其中一个字段是显示每个用户的头像的图像。我必须从 url 获取这些图像。

我创建了一个将图像从 URL 转换为位图的类。

我认为这应该通过异步任务来完成。问题是我不知道如何从自定义适配器调用此方法。

这是我的课:

private class obtAvatar2 extends AsyncTask<Void , Void, Bitmap>{
    Bitmap bm;

    @Override
    protected Bitmap doInBackground(Void... voids) {
        try {

            URL url = new URL("https://www.bellatores.cl/wp-content/uploads/2018/01/Avatar-Mujer.png");
            URLConnection con = url.openConnection();
            con.connect();
            InputStream is = con.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();

        }catch (IOException e){

        }

        return bm;
    }
}

这会返回一个位图。 然后从我的自定义适配器中,我需要将该位图放在 ImageView 中

例如,我正在尝试:

ImageView avatarView = (ImageView)view.findViewById(R.id.imageViewAvatarMensa);
avatarView.setImageBitmap(new obtAvatar2().execute());

但是,这是错误的:(

有什么建议吗?

【问题讨论】:

  • medium.com/@afomic/… 使用一些库来加载图像。滑翔,毕加索
  • 你为什么不用Glide
  • “但是,它错了”不是一个很好的错误描述。究竟会发生什么?我脑子里没有 AsyncTask api,执行只是启动任务,实际上没有返回任何东西?
  • 您应该使用能够更好地处理此问题的多个现有图像加载库之一。

标签: android android-studio listview


【解决方案1】:

我建议您使用 Glide 或 Picasso 库,它们是 Android 应用程序中最常用的图像库:

使用 gradle 导入你的项目:

毕加索

dependencies {
    compile 'com.squareup.picasso:picasso:2.5.1'
}

滑行

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
}

用法:

毕加索

Picasso.with(myFragment)
    .load(url)
    .into(myImageView);

滑行

Glide.with(myFragment)
    .load(url)
    .into(myImageView);

希望对你有帮助

【讨论】:

  • 优秀的图书馆!我从未使用过毕加索,它真的很简单。非常感谢您的建议!
  • @Mimmetico 很高兴它有帮助
【解决方案2】:

您可以使用GlidePicasso。因为这些库对于在适配器中设置图像非常有用(这里的视图是可重用的)。

如果您仍想使用 asynctask,请检查以下内容:

在适配器中每次滚动都会导致新的网络调用,这可以通过保存位图对象来避免。

您正在尝试使用以下代码获取图像:

ImageView avatarView = (ImageView)view.findViewById(R.id.imageViewAvatarMensa);
avatarView.setImageBitmap(new obtAvatar2().execute());

这不起作用:

new obtAvatar2().execute()

它将在后台执行并在 onPostExucute() 中返回响应。结果是:

avatarView.setImageBitmap(null)

如果你想使用 asytask 那么你可能需要让你的代码像:

private class obtAvatar2 extends AsyncTask<Void, Void, Bitmap> {
        Bitmap bm;

        @Override
        protected Bitmap doInBackground(Void... voids) {
            try {

                URL url = new URL("https://www.bellatores.cl/wp-content/uploads/2018/01/Avatar-Mujer.png");
                URLConnection con = url.openConnection();
                con.connect();
                InputStream is = con.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                bm = BitmapFactory.decodeStream(bis);
                bis.close();
                is.close();

            } catch (IOException e) {

            }

            return bm;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            ImageView avatarView = (ImageView)view.findViewById(R.id.imageViewAvatarMensa);
                avatarView.setImageBitmap(bitmap);
                //set bitmap to imageview and save in local list, so in future no need to download
            }
        }

您可以在构造函数中传递 ImageView 的引用。

【讨论】:

    【解决方案3】:

    首先你应该在你的自定义适配器中添加 obtAvatar2 异步任务。

    我希望你在你的 customadapter 中使用 ViewHolder,然后在你的 getView() 中,在为你的 Imageview 赋值之前,调用异步任务。例如:

     public static class ViewHolder {
    
        public ImageView display_adImage;
    
    }
    
    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
    
        try {
            if (convertView == null) {
    
                vi = inflater.inflate(R.layout.test_layout, null);
                holder = new ViewHolder();
    
                holder.display_adImage = vi.findViewById(R.id.IvAdImage);
    
    
                vi.setTag(holder);
            } else {
                holder = (ViewHolder) vi.getTag();
            }
    
            ...
    
    
            Bitmap b =  new GetImageTask().execute().get();
        holder.display_adImage.setImageBitmap(b);
    }
    }
    
     private class obtAvatar2 extends AsyncTask<Void , Void, Bitmap>{
    Bitmap bm;
    
    @Override
    protected Bitmap doInBackground(Void... voids) {
        try {
    
            URL url = new URL("https://www.bellatores.cl/wp-content/uploads/2018/01/Avatar-Mujer.png");
            URLConnection con = url.openConnection();
            con.connect();
            InputStream is = con.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();
    
        }catch (IOException e){
    
        }
    
        return bm;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多