好的,所以此代码就在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
缺乏了解,我刚开始学习它。谢谢!
答案 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();
}
}