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

时间:2014-05-30 17:15:13

标签: 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,以便我可以在主界面中使用它。有什么办法可以做到这一点吗?抱歉我对AsyncTask缺乏了解,我刚开始学习它。谢谢!

4 个答案:

答案 0 :(得分:11)

实际上不需要返回位图,而是在主Ui Thread中使用它。您可以在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中获得价值。

您可以采用的另一种方法是使用界面

实现回调
public interface MyInterface 
{
   public void onPostExecute();
}

活动类

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

}

 }

答案 1 :(得分:1)

你应该节省很多时间并使用Picasso。这将为您节省所有这些代码,并且它可以与位图一起使用。基本上你会写这样的东西:

Picasso.with(context).load("www.somthing.com/api/blah").placeholder(R.drawable.default_picture).into(imageView);

这是一行代码,你可以免费获得异步和缓存......

答案 2 :(得分:0)

您可以通过接口使用回调方法,也可以将asynctask作为内部类,只需调用一些方法来设置imageView ...

对于回调,有一个很好的例子here

答案 3 :(得分:0)

首先,onPostExecute在您的UI线程上执行,因此您不需要做与示例不同的任何事情。但如果您愿意,可以随时使用匿名类:

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        AsyncTask task = new BitmapWorkerTask() {
            @Override
            public void onPostExecute(Bitmap bitmap) {
                // Do whatever
            }
        };

        task.execute();
    }
}