【问题标题】:onPostExecute not runningonPostExecute 未运行
【发布时间】:2015-01-31 02:47:42
【问题描述】:

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

在这个类 (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;
    }
}
}

【问题讨论】:

  • while(dit != null) - dit 怎么会变成空?
  • 一个强制的 true 参数来保持代码运行.. @michele,你有捕获到异常吗??
  • 非常晦涩难懂。写while( true )
  • 为什么onPostExecute 没有标记为@Override
  • 您可能必须让我们知道代码实际输出的是什么,因为您模糊地断言“AsyncTask 继续运行”并不能帮助我们缩小问题范围,或者给我们任何确定性是的。

标签: java android multithreading android-asynctask


【解决方案1】:

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

// --- 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 加载器。我确信这段代码已经被写了一千遍了。如果你不懂线程和异步编程,你可以直接复制它。

【讨论】:

  • 是的,我是异步编程的新手。这就是为什么我试图找出我的错。 AsyncTask 之前在 Main Activity 类中处理过。
  • 但是我需要一个具有特定图像属性的类,我找到了让这个新类处理图像下载的逻辑,因为它是图像的一部分。正如你所说,我认为我的错是从一个不扩展任何视图的类中调用 Asynk 进程。在我多次尝试后看到 onPostExecute 方法(即使带有@Override 标记)从未被触发后,我决定进行 while 循环测试。@Andy
【解决方案2】:

你为什么从 doInBackground 函数返回?

返回_bmp; // 这里不需要返回 //结果会自动传递给onPostExcute()

【讨论】:

  • 因为如果我不这样做,doInBackground 会给我一个缺少返回语句的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
相关资源
最近更新 更多