0

我正在播放来自 Internet 的流,因为不应该在 UI 线程上处理网络操作等长进程,所以我正在使用 AsyncTask。在主线程中,我设置了一些 videoView 规范:

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.videoview);
    progressDialog = ProgressDialog.show(this, "Loading", "Please Wait", true, true);

    videoView = (VideoView) findViewById(R.id.surface_view);
    videoView.setVideoPath(ChannelPath);
    videoView.setMediaController(new MediaController(this));

    new LoadStream().execute("");
}

在 AsyncTask 我开始播放视频:

private class LoadStream extends AsyncTask<String, Void, Void> {
    protected Void doInBackground(String... urls) {
            videoView.setOnPreparedListener(new OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    videoView.start();
                    progressDialog.dismiss();
                }
            });
        return null;
    }
}

我试图在 AsyncTask 上拥有与 videoView 相关的所有部分,但无法在 AsyncTask 上设置视频路径和 setMediaController。我想知道哪个部分正是耗时的部分?我的代码好吗?还是我在 UI Thread 上还有很长的过程?

4

3 回答 3

2

当非 UI 线程希望对 UI 做某事时,该线程可以将 a 传递Runnable给 UI 线程以执行。有几种方法可以做到这一点;其中之一是让非 UI 线程执行类似以下的操作(这需要稍作调整;我在没有参考运行代码的情况下输入它):

runOnUiThread(new Runnable() {
    void run() {
        // place UI code here
    }
});
于 2013-01-21T12:41:01.753 回答
2

您不需要为此使用异步任务。仅在方法中使用ProgressDialog progressBar = ProgressDialog.show(context, "", "Loading Records, Please Wait..", true);并关闭此进度条。onPrepared

于 2013-01-21T12:48:47.743 回答
0

另请参阅http://developer.android.com/reference/android/media/MediaPlayer.html 最初的 prepare() 步骤需要时间,因此您应该在另一个线程上执行此操作或使用 prepareAsnyc 调用。setVideoPath() 方法仅设置将在 prepare() 中使用的路径。

如果您浏览代码(例如http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/VideoView.java#VideoView.openVideo () ) 你会看到,如果表面还没有初始化,那么那里什么也没有做,即使是,prepareAsync() 也会在该方法中被调用以完成繁重的工作。

于 2013-01-21T12:41:58.893 回答