AsyncTask完成执行

时间:2014-11-17 18:09:00

标签: android android-asynctask

我想知道如何暂停,取消此功能,以便关闭正在运行的Activity。

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;

public DownloadImageTask(ImageView bmImage) {
    this.bmImage = bmImage;
}

protected Bitmap doInBackground(String... urls) {
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {
    bmImage.setScaleType(ImageView.ScaleType.FIT_XY);
    bmImage.setImageBitmap(result);
}}

如何调用该函数来取消AsyncTask和InputStream

3 个答案:

答案 0 :(得分:0)

如果您正在进行计算:

您必须定期检查isCancelled()。 如果您正在执行HTTP请求:

HttpGetHttpPost的实例保存在某处(例如公共字段)。 致电取消后,请致电request.abort()。这会导致IOExceptiondoInBackground引入AsyncTask。 就我而言,我有一个连接器类,我在各种abortAllRequests中使用过。为了简单起见,我在该类中添加了一个新的{{1}}方法,并在调用cancel后直接调用了此方法。

答案 1 :(得分:0)

要取消位图加载,您可以使用requestCancelDecode的{​​{1}}方法。保留对Options对象的引用,并将其传递给BitmapFactory.Options方法。然后,您可以在对象上调用decodeStream来取消请求。 Android确实显示calling the method does not guarantee that decoding actually gets cancelled

答案 2 :(得分:0)

只要你想取消asynctask只需要一个静态变量,只需输入静态变量并在dobackground中返回它。这是使用线程最安全的方法

    protected Bitmap doInBackground(String... urls) {
   if(cancel)
{
return;
}
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();

        // ByteArrayOutputStream
        ByteArrayOutputStream out = new ByteArrayOutputStream(4048);

        // buffer
        byte[] buffer = new byte[4048];
        int bytesRead = -1;

        // isCancelled() == false is Important
        while ((isCancelled() == false) && (bytesRead = in.read(buffer)) != -1) {
            out.write(buffer, 0, bytesRead);
        }

        byte[] imageBytes = out.toByteArray();

        // Decode Bitmap from imageBytes
        if (isCancelled() == false) {
             mIcon11 = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        }

    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return mIcon11;
}