2011-07-01 13 views
18

Mam prostą czynność, która odtwarza wideo poprzez VideoViewandroid ANR w MediaPlayer zresetować

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(); 
} 
} 

W niektórych przypadkach, gdy użytkownik naciska przycisk wstecz, na tej działalności, przed rozpoczęciem odtwarzania wideo, ma ANR. Oto moje ślady:

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) 

także logcat pokazuje to:

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! 

znajdę this question i this bug, ale nie są rozwiązaniem.

+0

Mam ten sam problem, czy rozwiązałeś go? – dreamtale

+0

@dreamtale no :-( – kreker

+0

@dreamtale cóż, po prostu używam intencji do uruchomienia odtwarzacza wideo użytkownika – kreker

Odpowiedz

0

Jedną z technik, które uniemożliwiają systemowi Androidowi zawarcie kodu, który był responsywny przez dłuższy czas, jest utworzenie wątku podrzędnego. W wątku potomnym, większość faktycznych działań kodów może być umieszczona tak, że główny wątek działa z minimalnymi okresami braku odpowiedzi.

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

Jeśli otrzymujesz komunikat ANR oznacza że Twój applicaction jest niedostatecznie reagują na pewien okres czasu, należy runOnUiThread uruchomić określone działanie na wątku UI lub 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(); 
    } 
    } 

Spróbuj uruchomić setOnPreparedListener, aby uruchomić wideo.

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); 
Powiązane problemy