我正在尝试使用异步任务从MJPG流中检索JPG。我首先想到,我可以让任务连续运行,而只是在onProgressUpdate()方法中弹出缓冲的JPG。但这似乎不起作用,因为该方法仅显示整数,没有可绘制对象...我尝试了什么:

private class StreamTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {

        image = readMJPGStream();

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        imView.setImageDrawable(image); // << doesn't work
    }
}


你有什么想法?我应该尝试哪种方法?

提前非常感谢您!

哈克

最佳答案

当您启动AsyncTask时,将调用doInBackground,但仅运行一次。我不确定readMJPGStream的作用,但是假设它阻塞直到检索到图像,肯定有可能在图像仍然为null时调用onProgressUpdate多次,然后将图像设置为有效值并且doInbackground迅速退出,没有进一步的呼叫OnProgressUpdate

您可能应该将调用放在imView.setImageDrawable中的onPostExecute中,以确保在下载映像后调用该调用。您可能还需要在图像视图上调用invalidate()以确保重新绘制它。此外,如果您打算循环播放并继续下载图像,则需要设计一种触发更新的机制。实际上,您遇到的问题是因为您希望“按需”进入UI线程,但是您依赖于对onProgressUpdate的调用。使用处理程序和自己的Runnable / Thread可能会更好,因为当图像下载完成时,您可以发布到UI线程(使用Handler),而不必等待onProgressUpdate

10-07 19:28
查看更多