안드로이드 개발 질문/답변
(글 수 40,700)
동영상 로딩중일때 뒤로가기를 하여 어플을 종료시키면 ANR에러가 뜹니다
동영상 완료되고나서는 뒤로가기를 하여도 정상종료가 됩니다.
와이파이를 이용했을때도 괜찮습니다
3G를 이용하여 동영상을 로딩할때 뒤로가기를 하면 ANR에러가 뜹니다
소스 첨부하겠습니다.
CouncilMediaController 은 사용자클래스입니다 mediaController 을 상속받았습니다.
private VideoView mVideoViewCouncil;
private CouncilMediaController mMediaController;
private void initVideoView() {
if (DEBUG)
Log.d(TAG, "initVideoView");
setmIsPlaying(false);
this.mMediaController = new CouncilMediaController(this);
this.mMediaController.setMediaPlayer(mVideoViewCouncil);
this.mMediaController.setAnchorView(mVideoViewCouncil);
this.mVideoViewCouncil.setMediaController(mMediaController);
}
동영상재생시작부분입니다
private void onPlayMedia(final String url, final String time) {
if (DEBUG)
Log.d(TAG, "onPlayMedia(" + url + ", " + time + ")");
mProgressBarVodLoading.setVisibility(ProgressBar.VISIBLE);
mVideoViewCouncil.setVisibility(VideoView.VISIBLE);
if (this.mLinearLayoutVideoViewCouncil.getVisibility() == LinearLayout.GONE) {
this.mLinearLayoutVideoViewCouncil
.setVisibility(LinearLayout.VISIBLE);
}
Uri videoUri = Uri.parse(url);
this.mVideoViewCouncil.setVideoURI(videoUri);
this.mVideoViewCouncil.requestFocus();
long curtime = JUtil.TimeConvert(time);
if (curtime == -1) {
Toast.makeText(this, R.string.IncorrectPlay, Toast.LENGTH_SHORT)
.show();
}
if (curtime != 0)
this.mVideoViewCouncil.seekTo((int) curtime);
new Thread(new Runnable() {
public void run() {
Log.d(TAG, "1");
mVideoViewCouncil.start();
Log.d(TAG, "2");
mVideoViewCouncil.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
if (DEBUG)
Log.d(TAG, "setOnPreparedListener");
mProgressBarVodLoading.setVisibility(ProgressBar.GONE);
setmIsPlaying(true);
Configuration config = getResources().getConfiguration();
if(config.orientation == Configuration.ORIENTATION_LANDSCAPE)
setLandscape();
getPlayTimeProcess();
}
});
}
}).start();
}
동영상 정지부분입니다.여기에도 쓰레드가 있는데 주석처리된부분을 풀고 실행하니 ANR에러가 뜨진않지만 쓰레드에러가 떠서
일단 주석처리하였습니다.
private boolean onPauseMedia() {
Log.d(TAG, "onpauseMedia()");
if (this.mVideoViewCouncil == null
|| this.mLinearLayoutVideoViewCouncil == null)
return false;
if (this.mLinearLayoutVideoViewCouncil.getVisibility() == LinearLayout.VISIBLE) {
this.mLinearLayoutVideoViewCouncil.setVisibility(LinearLayout.GONE);
}
// if (this.mVideoViewCouncil.canPause()) {
this.mVideoViewCouncil.pause();
// }
new Thread(new Runnable(){
public void run(){
// mVideoViewCouncil.stopPlayback();
// mVideoViewCouncil.setMediaController(null);
}
}).start();
setmIsPlaying(false);
return true;
}
mVideoViewCouncil.pause();
ㅁ
이 메소드가 5초 이상 걸리는 메소든가 보네요.
스레드로 빼서 ANR을 회피하는 방식이 맞아 보이는데...스레드 에러라함은 어떤...?
정 그렇다면 Factory Pattern을 써서 해당 videoviewcouncil 을 따로 관리하고
background로 돌게 해야 될거 같네요.