【问题标题】:Getting a BitMap returned from AsyncTask in Java获取从 Java 中的 AsyncTask 返回的位图
【发布时间】:2016-04-01 22:19:09
【问题描述】:

我无法理解 AsyncTask。我正在向它发送一个文件位置,以便它可以检索它、调整它的大小并返回它。当我从我的活动(BaseAdapter ListView)中调用 asynctask 类时,我遇到了类型不匹配。

我认为我可以从执行中返回位图。我读过我需要使用 onPostExecute() 但不确定如何..

public class ImageHandler extends AsyncTask<String, Void, Bitmap> {
        Bitmap sizedBMP = null;
        @Override

        protected Bitmap doInBackground(String... params) {

            File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), "/"+params[0]+"/"+params[0]+".png");
            if (imgFile.exists()){
                Bitmap bmp = BitmapFactory.decodeFile(imgFile.toString());
                int newWidth = 500;
                sizedBMP = getResizedBitmap(bmp, newWidth);

            }
            else{
                //set no image available
            }
            return sizedBMP;

        }

        @Override
        // Once the image is downloaded, associates it to the imageView
        protected void onPostExecute(Bitmap sizedBMP) {

        }


    public Bitmap getResizedBitmap(Bitmap bm, int newWidth) {
        // Bitmap gets resized here.....

        }
}

我在 getView() 中调用这个类,例如:

ImageHandler imgHandler = new ImageHandler();
Bitmap bitMap;
bitMap = imgHandler.execute(filename);

错误:

类型不匹配:无法从 AsyncTask 转换为 位图

【问题讨论】:

  • 您不使用PicassoGlideFresco 或任何其他图像加载库的任何特定原因?
  • 嗯,有人建议滑翔,但我想我想自己学习如何让它工作。

标签: android bitmap android-asynctask baseadapter


【解决方案1】:

.execute 方法返回当前的 AsyncTask。要设置结果,请添加一个带有参数的构造函数,即要用于显示位图的 imageview。

public class ImageHandler extends AsyncTask<String, Void, Bitmap> {

        Bitmap sizedBMP = null;
        ImageView imageView;

        public ImageHandler(ImageView imageView){
             this.imageView = imageView;
        }

        @Override
        protected Bitmap doInBackground(String... params) {

            File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(), "/"+params[0]+"/"+params[0]+".png");
            if (imgFile.exists()){
                Bitmap bmp = BitmapFactory.decodeFile(imgFile.toString());
                int newWidth = 500;
                sizedBMP = getResizedBitmap(bmp, newWidth);

            }
            else{
                //set no image available
            }
            return sizedBMP;

        }

        @Override
        // Once the image is downloaded, associates it to the imageView
        protected void onPostExecute(Bitmap sizedBMP) {
                if(sizedBMP != null){
                    imageView.setImageBitmap(sizedBMP);
                }
        }


    public Bitmap getResizedBitmap(Bitmap bm, int newWidth) {
        // Bitmap gets resized here.....

        }
}

然后像这样在构造函数中设置imageView:

ImageHandler imgHandler = new ImageHandler(myImageView);
imgHandler.execute(filename);

这应该可以,但是如果您想使用这种类型的图像加载器,当滚动列表视图时,您可能会遇到其他问题 - 对于一行中的单个 ImageView 插槽,几个位图将在几秒钟内相互替换。

This 主题可以帮助您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多