好吧,所以这段代码就在Android开发者网站上,该网站设置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线程中使用它.您可以在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中获得价值.
您可以做的另一种方法是使用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<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; } } }