1. 程式人生 > >Android VideoView載入網路視訊過程中退出頁面,出現程式無響應 希望來大神指點一二

Android VideoView載入網路視訊過程中退出頁面,出現程式無響應 希望來大神指點一二

最近在做視訊播放,測試的時候出現頻繁迴圈(點選播放列表,進入播放頁面,返回列表頁),出現程式卡死問題。播放頁面載入慢的時候按返回鍵沒反應,再按就會出現無響應問題。也不報錯。
程式碼如下:
package com.ccphl.box.activity;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
import com.ccphl.android.tv.wmfw.R;
import com.ccphl.box.base.Constant;
import com.ccphl.box.pojo.ProgramInfo;
import com.ccphl.box.task.MyAsyncTask;
import com.ccphl.box.util.FileUtil;
import com.ccphl.box.util.T;
import com.ccphl.box.util.YuanJiaoUtil;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/**
 * 播放介面
 * 處理通過playUrl播放的視訊,點播使用
 * @author SYF
 * @creationtime 2014-8-4下午1:21:16
 */
public class VideoActivity extends BaseActivity {
private TextView programNameTextView;
private VideoView videoView;
private MediaController mediaController;
private ProgramInfo programInfo;
private String playUrlsss;
private PlayTask task;
private boolean isMediaCenter = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
init();
}
private void init(){
progressDialogShow();
videoView = (VideoView) findViewById(R.id.video_videoview);
programNameTextView = (TextView) findViewById(R.id.video_program_name);
mediaController = new MediaController(this, false);
mediaController.setMediaPlayer(videoView); 
videoView.setMediaController(mediaController);
videoView.setOnErrorListener(new MyOnErrorListener());
videoView.setOnCompletionListener(new MyOnCompletionListener());
videoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
T.showShort(context, "onPrepared");
videoView.start();
}
});
String programName = getIntent().getStringExtra("movieName");
programInfo = (ProgramInfo) getIntent().getSerializableExtra("programInfo");
isMediaCenter = (Boolean)getIntent().getBooleanExtra("isMediaCenter", false);
programNameTextView.setText(programName);
playUrlsss = programInfo.getPlayUrl();
play();
}

private void play(){
if(isMediaCenter){
videoView.setVideoPath(playUrlsss);
videoView.seekTo(currentPosition);
}else if(playUrlsss!=null && playUrlsss.length()>0){
task = new PlayTask(playUrlsss);
task.execute();
}else{
Toast.makeText(this, "無法播放視訊!", Toast.LENGTH_SHORT).show();
finish();
}
}

/**
 * 播放
 * 播放需要通過“播放請求地址”獲取真正的“播放地址”
 */
private class PlayTask extends AsyncTask<Void, Integer, Void>{
private String playUrl;

public PlayTask(String playUrl) {
super();
this.playUrl = playUrl;
}

@Override
public void onPreExecute() {
progressDialogShow("正在載入視訊……");
if(videoView.isPlaying()){
videoView.stopPlayback();
}
}
@Override
protected Void doInBackground(Void... arg0) {
playUrl = YuanJiaoUtil.getYjRealPlayUrl(playUrl);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
progressDialogDismiss();
T.showShort(context, "url="+playUrl);
if(playUrl=="" || playUrl.toString().length()<5){
Toast.makeText(getApplicationContext(), "無法獲取播放地址", Toast.LENGTH_SHORT).show();
finish();
}else{
if(playUrl.equals(Constant.TEMP_VIDEO_TEMP)){
Toast.makeText(getApplicationContext(), "該視訊暫時無法播放!", Toast.LENGTH_LONG).show();
}
videoView.setVideoPath(playUrl.toString());
videoView.seekTo(currentPosition);
}
}

}

/**
 * 
 */
private class MyOnErrorListener implements OnErrorListener {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
T.showShort(context, "error");
finish();
return true; //如果處理了錯誤返回true,否則返回false
}
};

/**
 * 視訊播放完
 */
private class MyOnCompletionListener implements OnCompletionListener{
@Override
public void onCompletion(MediaPlayer mp) {
T.showShort(context, "compelete");
finish();
}
}

    @Override
public void onPause() {
     try{
     if(videoView.isPlaying()){
     videoView.pause();
     }
            videoView.stopPlayback();
            if(task != null && !task.isCancelled()){
             task.cancel(true);
            }
     }catch(Exception e){
     e.printStackTrace();
     }
        super.onPause();
    }

    @Override
protected void onStop() {
     task = null;
     videoView = null;
super.onStop();
}
@Override
    public void onResume() {
        super.onResume();
    }
    
    @Override
    protected void onDestroy() {
     super.onDestroy();
    }
    
    /**
 * 遙控器按鈕事件
 */
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
}
}