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

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

 class BitmapWorkerTask extends AsyncTask { private final WeakReference imageViewReference; private int data = 0; public BitmapWorkerTask(ImageView imageView) { // Use a WeakReference to ensure the ImageView can be garbage collected imageViewReference = new WeakReference(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 Thread中使用它。 你可以在PostExecute上执行此操作,因为postExecute在UI线程中运行。 你的问题?? 是的,你可以从AsynTask返回位图,你可以做这样的事情

 private class myTask extends AsyncTask{ 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中获得价值。

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

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

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

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

这是一行代码,你可以免费获得Async和缓存……

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

对于回调,这里有一个很好的例子。

首先, 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(); } }