在 Java 中获取从 AsyncTask 返回的位图
Getting a BitMap returned from AsyncTask in Java
我无法理解 AsyncTask。我正在向它发送一个文件位置,以便它可以检索它、调整它的大小并 return 它。当我从我的 activity 调用异步任务 class 时,它是一个 BaseAdapter ListView,我遇到类型不匹配的问题。
我认为我可以 return 执行位图。我读过我需要使用 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() 中这样称呼这个 class:
ImageHandler imgHandler = new ImageHandler();
Bitmap bitMap;
bitMap = imgHandler.execute(filename);
错误:
Type mismatch: cannot convert from AsyncTask to
Bitmap
方法.execute
returns当前AsyncTask。要设置结果,请添加一个带有参数的构造函数,即要用于显示位图的图像视图。
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 主题可以帮助您。
我无法理解 AsyncTask。我正在向它发送一个文件位置,以便它可以检索它、调整它的大小并 return 它。当我从我的 activity 调用异步任务 class 时,它是一个 BaseAdapter ListView,我遇到类型不匹配的问题。
我认为我可以 return 执行位图。我读过我需要使用 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() 中这样称呼这个 class:
ImageHandler imgHandler = new ImageHandler();
Bitmap bitMap;
bitMap = imgHandler.execute(filename);
错误:
Type mismatch: cannot convert from AsyncTask to Bitmap
方法.execute
returns当前AsyncTask。要设置结果,请添加一个带有参数的构造函数,即要用于显示位图的图像视图。
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 主题可以帮助您。