java - onPostExecute 未运行

标签 java android multithreading android-asynctask

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

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

有人可以帮我吗?

我在主 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;
    }
}
}

最佳答案

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

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

关于java - onPostExecute 未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247633/

相关文章:

java - 使用 ASYNC 或其他线程优化布局/位图/数据库?

Java套接字测试返回空值

java - LibGDX 游戏暂停状态 : Animation flicker/bug

java - Android 无法通过密码验证

java - 多个字符串到 Arraylist

c# - System.threading.timer 在 Windows 服务中不工作

ios - 如何在iOS中的后台线程上绘制文本?

java - 如何从文件创建 BigQuery 连接

java - 在 Java 中通过 Socket 发送鼠标坐标

java - 如何将springsecurity集成到GWT中?