отображение хода выполнения перед видео - PullRequest
2 голосов
/ 07 февраля 2011

Я пытаюсь отобразить 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 ]

4 голосов
/ 07 февраля 2011

Вместо того, чтобы закрывать диалоговое окно прогресса в runOnUiThread, отклоните его в onPreparedListener:

mVideoView.setOnPreparedListener(new OnPreparedListener() {

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

runOnUiThread вызывается сразу, следовательно, закрывая диалоговое окно, прежде чем его можно увидетьЭтот код будет продолжать работать до тех пор, пока видео не будет готово к запуску.

0 голосов
/ 07 февраля 2011

Вам придется отойти от синхронных MediaPlayer вызовов, чтобы сделать это. MediaPlayer имеет серию обратных вызовов изменения состояния проигрывателя, таких как onPreparedListener , которые вам необходимо использовать, чтобы определить, когда отображать диалоговое окно.

То, что вы испытываете, связано с тем, что, хотя вы вкладываете работу в uiThread, вы в основном переносите всю свою работу в uiThread.

Звонок:

            mVideoView.setVideoPath(getDataSource(path));

идет по UIThread (по-видимому). Вам нужно использовать асинхронные слушатели, чтобы не создавать эти объекты для себя.

0 голосов
/ 07 февраля 2011

вы должны использовать AsyncTask для этого.взгляните на эту страницу .он дает вам подробную информацию о том, как делать то, что вы хотите.

...