Java 如何在适配器中使用后台任务?

Java 如何在适配器中使用后台任务?,java,android,multithreading,background,task,Java,Android,Multithreading,Background,Task,我有一个图像适配器,它应该负责更新图像网格。问题是我运行了一个BackgroundImageTask,它从URL获取位图。getView方法在后台任务完成更新之前返回imageView。如何强制后台任务在返回imageview之前完成 public class ImageAdapter extends BaseAdapter { private Context mContext; Bitmap bitmap; List<Post> postList; ImageView imageV

我有一个图像适配器,它应该负责更新图像网格。问题是我运行了一个BackgroundImageTask,它从URL获取位图。getView方法在后台任务完成更新之前返回imageView。如何强制后台任务在返回imageview之前完成

public class ImageAdapter extends BaseAdapter {
private Context mContext;
Bitmap bitmap;
List<Post> postList;
ImageView imageView;
int pos;

public ImageAdapter(Context c, List<Post> p) {
    mContext = c;
    postList = p;
}
public int getCount() {
    return postList.size();
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}



// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
    pos=position;
    View convert = convertView;
    if (convert == null) {
        // if it's not recycled, initialize some attributes
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 320));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(0, 0, 0, 0);
    } else {
        imageView = (ImageView) convert;
    }
    new BackgroundImageTask().execute();

    return imageView;
}

public View SetBit(Bitmap b){
    imageView.setImageBitmap(b);
    return imageView;
}

class BackgroundImageTask extends AsyncTask<Void, Void, Bitmap> {
    @Override
    protected Bitmap doInBackground(Void... params) {
        Bitmap bit1=bitmap;
        try {

           bit1 = BitmapFactory.decodeStream((InputStream)new URL(postList.get(pos).thumbnail).getContent());

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bit1;
    }

    @Override
    protected void onPostExecute(Bitmap bit) {
        SetBit(bit);
    }
}
公共类ImageAdapter扩展了BaseAdapter{
私有上下文;
位图;
列表postList;
图像视图图像视图;
int pos;
公共ImageAdapter(上下文c,列表p){
mContext=c;
postList=p;
}
public int getCount(){
返回postList.size();
}
公共对象getItem(int位置){
返回null;
}
公共长getItemId(int位置){
返回0;
}
//为适配器引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父视图){
pos=位置;
视图转换=转换视图;
if(convert==null){
//如果没有回收,初始化一些属性
imageView=新的imageView(mContext);
setLayoutParams(新的GridView.LayoutParams(GridView.AUTO_-FIT,320));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
setPadding(0,0,0,0);
}否则{
imageView=(imageView)转换;
}
新建BackgroundImageTask().execute();
返回图像视图;
}
公共视图设置(位图b){
设置图像位图(b);
返回图像视图;
}
类BackgroundImageTask扩展了AsyncTask{
@凌驾
受保护位图doInBackground(无效…参数){
位图bit1=位图;
试一试{
bit1=BitmapFactory.decodeStream((InputStream)新URL(postList.get(pos.缩略图).getContent());
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回比特1;
}
@凌驾
受保护的void onPostExecute(位图位){
SetBit(bit);
}
}
}在您的情况下:

您需要确保任务何时完成并启动setAdapter

getStatus()
检查
AsyncTask
是挂起、正在运行还是已完成

尝试以下方法

 LoadImageInBackground loadTask = new LoadImageInBackground();

if(loadTask.getStatus() == AsyncTask.Status.PENDING){
// My AsyncTask has not started yet
}
if(loadTask.getStatus() == AsyncTask.Status.RUNNING){
// My AsyncTask is currently doing work in doInBackground()
}

if(loadTask.getStatus() == AsyncTask.Status.FINISHED){
// My AsyncTask is done and onPostExecute was called
}

相反,您可以将ImageView对象传递给后台任务,如

    new BackgroundImageTask(imageView).execute();

class BackgroundImageTask扩展了AsyncTask{
ImageView iv;
BackgroundImageTask(ImageView ImageView){
iv=图像视图;
}
@凌驾
受保护位图doInBackground(无效…参数){
位图bit1=位图;
试一试{
bit1=BitmapFactory.decodeStream((InputStream)新URL(postList.get(pos.缩略图).getContent());
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回比特1;
}
@凌驾
受保护的void onPostExecute(位图位){
iv.设置图像位图(位);
}
}

在哪里执行此操作?这取决于setadapter(ImageAdapter)方法的位置。
  class BackgroundImageTask extends AsyncTask<Void, Void, Bitmap> {
  ImageView iv;
BackgroundImageTask(ImageView imageView){
 iv = imageView;
}

@Override
protected Bitmap doInBackground(Void... params) {
    Bitmap bit1=bitmap;
    try {

       bit1 = BitmapFactory.decodeStream((InputStream)new URL(postList.get(pos).thumbnail).getContent());

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bit1;
}

@Override
protected void onPostExecute(Bitmap bit) {
    iv.setImageBitmap(bit);
}
}