【问题标题】:Android: display image during async background streaming taskAndroid:在异步后台流任务期间显示图像
【发布时间】:2011-02-03 23:31:25
【问题描述】:

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

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
    }
}

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

非常感谢您!

哈克

【问题讨论】:

    标签: android stream android-asynctask


    【解决方案1】:

    当您启动 AsyncTask 时,会调用 doInBackground,但它只运行一次。我不确定readMJPGStream 做了什么,但假设它在检索到图像之前一直阻塞,那么当您的图像仍然为空时,onProgressUpdate 肯定会被调用多次,然后一旦图像设置为有效并且 doInbackground 快速退出,没有进一步的呼叫OnProgressUpdate

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

    【讨论】:

    • 坦克尼克,是的,我想,你有一种方法可以连续使用doInBackground。如果我只使用一次imView.setImageDrawableonPostExecute 中画得很好。我现在再给 Runnable/Thread 一个机会。 invalidate() 也是一个很好的提示!
    【解决方案2】:

    我现在让它这样运行:

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

    哈克

    【讨论】:

    • 尝试 handler.post(new Runnable() { public run() { imView.setImageDrawable(image); } } 在你的 run 方法中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多