我正在尝试使用异步任务从MJPG Stream中检索JPG。我首先想到的是,我可以让任务继续运行,只是让缓冲的JPG在onProgressUpdate()方法中弹出。但这似乎不起作用,因为该方法只显示整数,没有drawables ......我尝试过:
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
}
}
你有什么想法吗?我应该尝试什么方法?
非常感谢你!
哈克
答案 0 :(得分:1)
启动AsyncTask时,会调用doInBackground
,但只运行一次。我不确定readMJPGStream
是做什么的,但是假设它一直阻塞直到检索到一个图像,当你的图像仍然为null时,onProgressUpdate被调用几次肯定是可能的,然后一旦图像被设置为有效的东西并且快速的doInbackground退出,无法再拨打OnProgressUpdate
。
你可能应该在imView.setImageDrawable
中调用onPostExecute
,以确保在下载图像时调用它。您可能还需要在图片视图上调用invalidate()
以确保重绘。此外,如果您打算循环并继续下载图像,则需要设计一种触发更新的机制。实际上,您遇到的问题是因为您希望“按需”获取UI线程,但您依赖于对onProgressUpdate
的调用。使用Handler和你自己的Runnable / Thread会有更好的运气,因为当图像下载完成时,你可以发布到UI线程(使用Handler
),而不必等待{{1} }。
答案 1 :(得分:0)
我现在以这种方式运行:
public class StreamActivity extends Activity implements Runnable{
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imView = (ImageView) findViewById(R.id.imView);
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
while (connected){
image = readMJPGStream();
handler.sendEmptyMessage(0);
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
imView.setImageDrawable(image);
}
};
public Drawable readMJPGStream() {
//...
return image;
}
}
唯一的问题是我的while
循环不够快。非常感谢任何想法!
哈克