运行多个异步任务会将任务返回到错误的处理程序

时间:2018-03-13 22:51:37

标签: android android-asynctask

我创建了几个图片对象,每个图片对象都下载自己的图片。但通常情况下,相同的图像会显示几个(或所有)对象。

public class Picture {

private String userID;
private String fileName;
private String baseURI;
private Bitmap img;

public Picture () {
    this.userID = "";
    this.fileName = "";
    this.baseURI = "";
}

/**
 * Retrieves the UUID of the User
 *
 * @return - String
 */
public String getUserID() {return userID;}
public void setUserID(String _userID) {userID = _userID;}


/**
 * Retrieves the Filename of the Picture
 *
 * @return - String
 */
public String getFileName() {return fileName;}

public void setFileName(String fileName) {
    this.fileName = fileName;

    //Don't retrieve a file from the server if the filename is empty or it is a placeholder
    if (fileName != "" && fileName != "NoNewPicure" && fileName != "NewPicture") {

        new RetrieveImageTask(getFileNameURI(), img) {
            @Override
            protected void onPostExecute(Bitmap result) {
                super.onPostExecute(result);
                setPreview(result);
            }
        }.execute();
    }
}

private URI getFileNameURI() {
    return URI.create(baseURI.concat(fileName));
}
private void setBaseURI(String baseURI) {
    this.baseURI = baseURI;
}

/**
 * Accesors for preview image
 * @return - Image
 */
@Bindable
public Bitmap getPreview() {return img;}
public void setPreview(Bitmap img) {
    this.img = img;
    notifyPropertyChanged(BR.preview);
}

private static class RetrieveImageTask extends AsyncTask<URI, Void, Bitmap> {
    static URI uriString;
    static Bitmap myBitmap;
    private Exception exception;

    RetrieveImageTask(URI uri, Bitmap bitmap) {
        uriString = uri;
        this.myBitmap = bitmap;
    }
    protected Bitmap doInBackground(URI... src) {
        try {
            Log.e("src",uriString.toString());
            URL url = new URL(uriString.toString());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            Log.e("Bitmap","returned");
            return myBitmap;
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("Exception",e.getMessage());
            return null;
        }
    }

    protected void onPostExecute(Bitmap result) {
        //Do nothing
    }
}
}

在代码中,图像是从for循环中调用的:

for (int i = 0; i < jArray.length(); i++) {
    JSONObject json_data = jArray.getJSONObject(i);
    Picture pic = new Picture();
    pic.fromJSON(json_data);
    result.add(pic);
}

似乎异步任务返回时,几个(或所有)处理程序触发。有想法该怎么解决这个吗?我已尝试添加:

@Override
protected void onPostExecute(Bitmap result) {
    super.onPostExecute(result);
    URI thisURI = getFileNameURI();
    if (uriString.equals(thisURI)) {
        setPreview(result);
    }
}

但是只有一个Picture对象实际上会获得一个图像。

1 个答案:

答案 0 :(得分:0)

听到墙上的另一块砖后,答案很简单。如果你不吃肉,你就不能吃任何布丁!如果文件没有下载,我就无法获得我的位图。但是我可以把碗放在布丁的地方,这样我吃完肉后就能吃掉我的布丁。我改变了我的AsynTask:

Option Explicit
Sub tasks()
    Dim OutApp As Outlook.Application
    Set OutApp = CreateObject("Outlook.Application")

    Dim OutTask As Outlook.TaskItem
    Set OutTask = OutApp.CreateItem(olTaskItem)

    Dim myRecipient As Outlook.Recipient
    Set myRecipient = OutTask.Recipients.Add("0m3r@Email.com")
        myRecipient.Type = olTo
        myRecipient.Resolve

     If myRecipient.Resolved Then
        With OutTask
        .Display
           .Subject = Cells(3, "I")
           .StartDate = Now
           .DueDate = Cells(2, "I")
           .Body = "Please see the attached email."
        End With
    End If

    Set OutTask = Nothing
    Set OutApp = Nothing
End Sub

请注意类包装器中的公共变量。现在当我调用我的任务时(代码从上面改变):

    private class RetrieveImageTask extends AsyncTask<URI, Void, Boolean> {
    public URI uriString;
    public Picture pic;

    RetrieveImageTask(URI uri) {
        uriString = uri;
    }
    protected Boolean doInBackground(URI... src) {
        try {
            Log.e("src",uriString.toString());
            URL url = new URL(uriString.toString());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(input);
            Log.e("Bitmap","returned");
            pic.setPreview(bitmap);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("Exception",e.getMessage());
            return null;
        }
    }

    protected void onPostExecute() {
        //Do nothing
    }
}
我的碗将是布丁的所在地。 IE浏览器。我将调用对象作为变量放在私有AsyncTask类中,该类填充完成运行时所需的内容。 :D吃完肉后,我的碗布丁已经满了!!!!