java - 如何从 Android 应用程序中的异步任务返回位图

标签 java android bitmap android-asynctask imageview

好的,所以这段代码就在 Android 开发者网站上,它将 ImageView 设置为 Bitmap:

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int data = 0;

public BitmapWorkerTask(ImageView imageView) {
    // Use a WeakReference to ensure the ImageView can be garbage collected
    imageViewReference = new WeakReference<ImageView>(imageView);
}

// Decode image in background.
@Override
protected Bitmap doInBackground(Integer... params) {
    data = params[0];
    return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
}

// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
    if (imageViewReference != null && bitmap != null) {
        final ImageView imageView = imageViewReference.get();
        if (imageView != null) {
            imageView.setImageBitmap(bitmap);
        }
    }
}
}

基本上,我想做的不是做

imageView.setImageBitmap(bitmap); 我想返回那个 Bitmap,这样我就可以在我的主 UI 中使用它。有什么办法可以做到这一点?抱歉,我对 AsyncTask 缺乏了解,我最近才开始学习它。谢谢!

最佳答案

实际上没有必要返回位图,而是在主 Ui 线程中使用它。您可以在 PostExecute 上执行此操作,因为 postExecute 在 UI 线程中运行。你的问题??是的,你可以从 AsynTask 返回位图,你可以这样做

private class myTask extends AsyncTask<Void,Void,Bitmap>{


      protected Bitmap doInBackground(Void... params) {

            //do stuff
             return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            //do stuff

            }
        }

现在你可以通过调用获取位图

 Bitmap returned_bitmap = new myTask().execute().get()

这也不好,这会挂起您的 UI。但您可以像这样从 Aysnc 获得值(value)。

另一种方法是使用接口(interface)实现回调

public interface MyInterface 
{
   public void onPostExecute();
}

Activity 类

 public class MyActivity extends Activity implements MyInterface{

private Bitmap Image;

public void onCreate(Bundle b)
{
    super.onCreate(b);

    new MyTask(this).execute();
}

@Override
public void onPostExecute() {
        //Now you have your bitmap update by do in background 
    //do stuff here 
}


private class MyTask extends AsyncTask<Void, Void, Void>
{
    MyInterface myinterface;

    MyTask(MyInterface mi)
    {
        myinterface = mi;
    }

    @Override
    protected Void doInBackground(Void... params) {
        //firt declare bitmap as class member of MyActivity 
        //update bitmap here and then call

        myinterface.onPostExecute();

        return null;
    }

}

 }

关于java - 如何从 Android 应用程序中的异步任务返回位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23960025/

相关文章:

android - card.io 在生产中不起作用

java - 如何在java中进行相互SSL认证

java - drawImage() 不绘制

android - menu.findItem(R.id.*) 为 null- Android

android - 从资源设置背景图片

multithreading - 如何暂停一个线程?

c# - 将图像转换为字节数组的最快方法

java - Android 列出可以查看未知文件的应用程序

Java 表达式在直接在代码中声明时有效,但在从 Spring 注入(inject)加载时无效

android - 播放ToneGenerator原因ANR