Android:在异步后台流式传输任务期间显示图像

时间:2011-02-03 23:31:26

标签: android stream android-asynctask

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

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

非常感谢你!

哈克

2 个答案:

答案 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循环不够快。非常感谢任何想法!

哈克