我正在尝试使用异步任务从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
。