onPostExecute没有运行

时间:2015-01-31 02:47:43

标签: java android multithreading android-asynctask

我有一个单独的类(不是活动)来管理带有属性的图像。

在这个类(Image.class)中,我还创建了一个AsynkTask来从Web下载位图。 一切正常,除了AsyncTask继续运行,而不触发onPostExecute()方法。

有人可以帮助我吗?

我在一个循环内的Main Activity中实例化这个类。

public class InstaImage {

public URL thumbUrl;
public URL lowresUrl;
public URL standardresUrl;

private URL url;
private Bitmap bmp;

public InstaImage(URL _thumb, URL _low, URL _standard ) {
    this.thumbUrl = _thumb;
    this.lowresUrl = _low;
    this.standardresUrl = _standard;
}

public Bitmap getBitmap(String resolution) {

    switch(resolution) {
        case "thumb":
            url = thumbUrl;
            break;

        case "low":
            url = lowresUrl;
            break;

        case "standard":
            url = standardresUrl;
            break;
    }

    DownloadImageTask dit = new DownloadImageTask();

    dit.execute();

    // --- TEST ASYNC STATUS ---
    while(dit != null) {

        if(dit.getStatus() == AsyncTask.Status.FINISHED) {
            Log.i("ASYNC", "END2!!");
            break;
        }
        else {
            Log.w("ASYNC WAITING", dit.getStatus().toString());
        }
    }

    // --- END TEST ASYNC STATUS ---

    return bmp;
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    URLConnection conn = null;
    InputStream in = null;
    Bitmap _bmp = null;

    @Override
    protected Bitmap doInBackground(String... urls) {
        Log.i("ASYNC","STARTING!!");
        try {
            conn = url.openConnection();

            if (conn != null) {

                in = conn.getInputStream();

                _bmp = BitmapFactory.decodeStream(in);

                in.close();
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        Log.i("ASYNC","END0!!");

        return _bmp;
    }


    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        Log.i("ASYNC","END1!!");
        bmp = result;
    }
}
}

2 个答案:

答案 0 :(得分:0)

您对线程的工作方式存在误解。您正在使用异步调用,然后忙着等待它完成。

// --- TEST ASYNC STATUS ---
while(dit != null) {

    if(dit.getStatus() == AsyncTask.Status.FINISHED) {
        Log.i("ASYNC", "END2!!");
        break;
    }
    else {
        Log.w("ASYNC WAITING", dit.getStatus().toString());
    }
}

// --- END TEST ASYNC STATUS ---

return bmp;

抱歉,您可能需要阅读一些主题。

我建议创建一个类InstaImageView extends ImageView并在其中添加一个异步URI加载器。我确定这段代码写了一千遍。如果你不了解线程和异步编程,你可以复制它。

答案 1 :(得分:-1)

为什么你从doInBackground功能返回?

return _bmp; //不需要回到这里 //结果将自动传递给onPostExcute()