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

 chenhe86888 发布于 2023-01-12 13:53

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

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,我刚开始学习它.谢谢!

1 个回答
  • 实际上不需要返回位图,而是在主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;
        }
    
    }
    
     }
    

    2023-01-12 13:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有