2011-07-01 2 views
18

나는 사용자가 버튼을 다시 밀어 때이 활동에, 어떤 경우에는 VideoView를 지켜 보면서안드로이드 ANR은 비디오가 재생을 시작하기 전에, 그가 ANR있어,

public class AVideo extends Activity { 
private VideoView mVideoView; 
private MediaController mc; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.a_video); 
    Bundle extras = getIntent().getExtras(); 
    Uri path = Uri.parse(extras.getString("videoURI")); 
    mVideoView = (VideoView) findViewById(R.id.video); 
    mVideoView.setVideoURI(path); 
    mc = new MediaController(this); 
    mVideoView.setMediaController(mc); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    mVideoView.start(); 
    mc.show(); 
} 
} 

을 통해 비디오를 재생하는 간단한 활동을 가지고 다시 설정합니다.

07-01 15:11:40.408: WARN/libutils.threads(2967): Thread (this=0x22818): don't call 
waitForExit() from this Thread object's thread. It's a guaranteed deadlock! 

내가 this questionthis bug을 찾을 수 있지만, 해결책이 없다 :

DALVIK THREADS: 
"main" prio=5 tid=3 NATIVE 
| group="main" sCount=1 dsCount=0 s=N obj=0x4001b268 self=0xbd00 
| sysTid=423 nice=0 sched=0/0 cgrp=default handle=-1344001384 
at android.media.MediaPlayer._reset(Native Method) 
at android.media.MediaPlayer.reset(MediaPlayer.java:1028) 
at android.widget.VideoView.release(VideoView.java:476) 
at android.widget.VideoView.access$2100(VideoView.java:49) 
at android.widget.VideoView$6.surfaceDestroyed(VideoView.java:467) 
at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:488) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:413) 
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:189) 
at android.view.View.dispatchWindowVisibilityChanged(View.java:3782) 
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:692) 
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:692) 
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:692) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:706) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4363) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
at dalvik.system.NativeStart.main(Native Method) 

또한 로그 캣이 보여줍니다 여기에 내 흔적을합니다.

+0

나는이 문제를 해결 했습니까? – dreamtale

+0

@dreamtale no :-( – kreker

+0

@dreamtale 잘, 그냥 사용자의 비디오 플레이어를 시작하기 위해 의도를 사용합니다. – kreker

답변

0

오랜 기간 동안 응답 한 코드를 Android 시스템이 종료하지 못하게하는 한 가지 방법은 하위 스레드를 만드는 것입니다. 자식 스레드 내에서 코드의 실제 동작 대부분을 배치 할 수 있으므로 주 스레드는 최소의 응답 시간으로 실행됩니다.

0
public class AVideo extends Activity { 
private VideoView mVideoView; 
private MediaController mc; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.a_video); 
    Bundle extras = getIntent().getExtras(); 
    Uri path = Uri.parse(extras.getString("videoURI")); 
    mVideoView = (VideoView) findViewById(R.id.video); 
    mVideoView.setVideoURI(path); 
    mc = new MediaController(this); 
    mVideoView.setMediaController(mc); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    mVideoView.start(); 
    mc.show(); 
} 

} 
1

는 ANR 메시지가 표시되는 경우는, 지정된 UI 스레드에 대한 조치 또는 Asynctask

public class AVideo extends Activity { 
    private VideoView mVideoView; 
    private MediaController mc; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.a_video); 
     Bundle extras = getIntent().getExtras(); 
     Uri path = Uri.parse(extras.getString("videoURI")); 
     mVideoView = (VideoView) findViewById(R.id.video); 

     runOnUiThread(new Runnable() { 
        @Override 
        public void run() {     
          mVideoView.setVideoURI(path); 
        } 
       }); 

     mc = new MediaController(this); 
     mVideoView.setMediaController(mc); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mVideoView.start(); 
     mc.show(); 
    } 
    } 

을 실행하는 runOnUiThread를 사용하십시오 applicaction 시간 동안 불충분하게 반응하는 것을 의미한다 setOnPreparedListener를 구현하여 비디오를 시작하십시오.

mVideoView.setOnCompletionListener(new OnCompletionListener() {     
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      Log.i("VIDEO", "onCompletion");     
     } 
    }); 
    mVideoView.setOnPreparedListener(new OnPreparedListener() {    
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      Log.i("VIDEO", "onPrepared"); 
       if(mVideoView.canSeekForward()) mVideoView.seekTo(mVideoView.getDuration()/5); 
       mVideoView.start();     
     } 
    }); 
    mVideoView.setKeepScreenOn(true); 
관련 문제