在视频之前显示progressdialog

时间:2011-02-07 14:28:53

标签: android video progressdialog

我正在尝试使用以下代码在视频前显示ProgressDialog:

package com.Boodang;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.URLUtil;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.VideoView;

public class VideoLoading extends Activity implements Runnable {
    private static final String TAG = "VideoViewDemo";

    private VideoView mVideoView;
    private EditText mPath;
    private ImageView mPlay;
    private ImageView mPause;
    private ImageButton mReset;
    private ImageView mStop;
    private String current;
    private ProgressDialog dialog;
    private Context mContext;
    String s=null;
    @Override
    public void onCreate(Bundle state){

    super.onCreate(state);


    dialog=ProgressDialog.show(this,"","Loding.PleaseWait",true);
    Thread t=new Thread(this);
    t.start();
       Log.e("VideoPlay1 page","OnStart");
        setContentView(R.layout.videoplay);


        mPlay = (ImageView) findViewById(R.id.play);
        mPause = (ImageView) findViewById(R.id.pause);

        mStop = (ImageView) findViewById(R.id.stop);

        mPlay.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {

            }
        });
        mPause.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                if (mVideoView != null) {
                    mVideoView.pause();
                }
            }
        });

        mStop.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                if (mVideoView != null) {
                    current = null;
                    mVideoView.stopPlayback();
                }
            }
        });
    runOnUiThread(new Runnable(){
        public void run() {
              dialog.dismiss();
            }

        });


    }
    public void run(){
        Message msg;
        handler.sendEmptyMessage(0);
    }
 Handler handler=new Handler(){
@Override
 public void handleMessage(Message msg) {
        try {

            mVideoView = (VideoView) findViewById(R.id.video);
            s=getIntent().getStringExtra("id");

            final String path = s;
            Log.v(TAG, "path: " + path);
            if (path == null || path.length() == 0) {
            Toast.makeText(VideoLoading.this, "File URL/path is empty",
                        Toast.LENGTH_LONG).show();

            } else {
                // If the path has not changed, just start the media player
                if (path.equals(current) && mVideoView != null) {
                    mVideoView.start();
                    mVideoView.requestFocus();
                return;
            }
            current = path;
                mVideoView.setVideoPath(getDataSource(path));
                mVideoView.start();
                mVideoView.requestFocus();


            }
        } catch (Exception e) {
            Log.e(TAG, "error123: " + e.getMessage(), e);
            if (mVideoView != null) {
                mVideoView.stopPlayback();
            }
        }

    }
 };
    private String getDataSource(String path) throws IOException {
        if (!URLUtil.isNetworkUrl(path)) {
            return path;
        } else {
            URL url = new URL(path);
            URLConnection cn = url.openConnection();
            cn.connect();
            InputStream stream = cn.getInputStream();
            if (stream == null)
                throw new RuntimeException("stream is null");
            File temp = File.createTempFile("mediaplayertmp", "dat");
            temp.deleteOnExit();
            String tempPath = temp.getAbsolutePath();
            FileOutputStream out = new FileOutputStream(temp);
        byte buf[] = new byte[128];
            do {
            int numread = stream.read(buf);
                if (numread <= 0)
                    break;
                out.write(buf, 0, numread);


            } while (true);

            try {
                stream.close();

            } catch (IOException ex) {
               Log.e(TAG, "error: " + ex.getMessage(), ex);
            }
            return tempPath;
        }
    }


}

但我没有在这里获得进度条。我得到的只是视频。

感谢所有帮助。

3 个答案:

答案 0 :(得分:4)

不是在runOnUiThread中解除进度对话框,而是在onPreparedListener中将其关闭:

mVideoView.setOnPreparedListener(new OnPreparedListener() {

    public void onPrepared(MediaPlayer arg0) {
        dialog.dismiss();
        mVideoView.start();
    }
});

立即调用runOnUiThread,因此在可以看到之前消除对话框。此代码将继续运行,直到视频准备好开始。

答案 1 :(得分:0)

你应该使用AsyncTask来做到这一点。看看this page。它为您提供了如何做您想要的详细信息。

答案 2 :(得分:0)

您必须放弃同步MediaPlayer调用才能执行此操作。 MediaPlayer有一系列播放器状态更改回调,例如onPreparedListener,您需要使用它来确定何时显示对话框。

您所经历的是因为,虽然您正在为uiThread工作,但您基本上是将所有工作都投入到uiThread中。

电话:

            mVideoView.setVideoPath(getDataSource(path));

正在进行uiThread(貌似)。您需要使用异步侦听器来避免为自己构建这些工具。