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

use*_*637 2 java android bitmap imageview android-asynctask

好吧,所以这段代码就在Android开发者网站上,该网站设置ImageViewBitmap:

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);
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想做的不是做

imageView.setImageBitmap(bitmap);我想返回,Bitmap然后我可以在我的主UI中使用它.有什么办法可以做到这一点吗?对于我缺乏知识感到抱歉AsyncTask,我刚开始学习它.谢谢!

ume*_*k44 11

实际上不需要返回位图,而是在主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

            }
        }
Run Code Online (Sandbox Code Playgroud)

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

 Bitmap returned_bitmap = new myTask().execute().get()
Run Code Online (Sandbox Code Playgroud)

再次这不好,这会挂起您的UI.但你可以从这样的Aysnc中获得价值.

您可以做的另一种方法是使用interface实现回调

public interface MyInterface 
{
   public void onPostExecute();
}
Run Code Online (Sandbox Code Playgroud)

活动类

 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;
    }

}

 }
Run Code Online (Sandbox Code Playgroud)