2013-03-14 172 views
0

当我按下按钮时,我的应用程序应该开始一段时间,然后当我点击同一个按钮时停止它。应用程序进入,并播放一次,然后崩溃。为什么?Android应用程序在崩溃时崩溃

Java代码:按下按钮后,

metronomepp.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      if (ms==0) {ms=1;} 
      while (ms == 1) { 
       if (metronome.isPlaying()) {metronome.pause();} 
       metronome.seekTo(0); 
       metronome.setOnSeekCompleteListener(null); 
       metronome.start(); 
       metronome.setOnCompletionListener(null); 
       try { 
        wait ((long) timetw); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       metronomepp.setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         Log.i("Metronome", "InWhile1"); 
         ms=0; 
        } 
       }); 
      } 
     } 
    }); 

的logcat:

03-14 19:10:30.584: I/Metronome clicked(25448): 1 
03-14 19:10:30.584: I/Metronome(25448): InWhile 
03-14 19:10:30.584: V/MediaPlayer(25448): isPlaying: 0 
03-14 19:10:30.584: V/MediaPlayer-JNI(25448): isPlaying: 0 
03-14 19:10:30.584: V/MediaPlayer-JNI(25448): seekTo: 0(msec) 
03-14 19:10:30.584: V/MediaPlayer(25448): seekTo 0 
03-14 19:10:30.584: V/MediaPlayer(25448): getDuration 
03-14 19:10:30.584: V/MediaPlayer(25448): message received msg=4, ext1=0, ext2=0 
03-14 19:10:30.589: V/MediaPlayer(25448): Received seek complete 
03-14 19:10:30.589: V/MediaPlayer(25448): All seeks complete - return to regularly scheduled program 
03-14 19:10:30.589: V/MediaPlayer(25448): callback application 
03-14 19:10:30.589: V/MediaPlayer(25448): back from callback 
03-14 19:10:30.589: V/MediaPlayer-JNI(25448): start 
03-14 19:10:30.589: V/MediaPlayer(25448): start 
03-14 19:10:30.619: D/AndroidRuntime(25448): Shutting down VM 
03-14 19:10:30.619: W/dalvikvm(25448): threadid=1: thread exiting with uncaught exception (group=0x40c581f8) 
03-14 19:10:30.624: E/AndroidRuntime(25448): FATAL EXCEPTION: main 
03-14 19:10:30.624: E/AndroidRuntime(25448): java.lang.IllegalMonitorStateException: object not locked by thread before wait() 
03-14 19:10:30.624: E/AndroidRuntime(25448): at java.lang.Object.wait(Native Method) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at java.lang.Object.wait(Object.java:401) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at com.example.guitartools.MetronomeActivity$3.onClick(MetronomeActivity.java:72) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at android.view.View.performClick(View.java:3627) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at android.view.View$PerformClick.run(View.java:14329) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at android.os.Handler.handleCallback(Handler.java:605) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at android.os.Looper.loop(Looper.java:137) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at android.app.ActivityThread.main(ActivityThread.java:4511) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at java.lang.reflect.Method.invokeNative(Native Method) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at java.lang.reflect.Method.invoke(Method.java:511) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
03-14 19:10:30.624: E/AndroidRuntime(25448): at dalvik.system.NativeStart.main(Native Method) 
03-14 19:10:30.969: V/MediaPlayer(25448): message received msg=2, ext1=0, ext2=0 
03-14 19:10:30.969: V/MediaPlayer(25448): playback complete 
03-14 19:10:30.969: V/MediaPlayer(25448): callback application 
03-14 19:10:30.969: V/MediaPlayer(25448): back from callback 

回答

0

你不应该阻塞主线程:

at java.lang.Object.wait(Native Method) 
... 
at android.app.ActivityThread.main(ActivityThread.java:4511) 

为Android建议的方法是使用一个处理器和运行的,像这样:

metronomepp.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     if (ms==0) {ms=1;} 

     if (ms==1) { 
      metronomepp.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        metronomepp.setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          Log.i("Metronome", "InWhile1"); 
          ms=0; 
         } 
        }); 
       } 
      }, timetw); 
     } 

     while (ms == 1) { 
      if (metronome.isPlaying()) {metronome.pause();} 
      metronome.seekTo(0); 
      metronome.setOnSeekCompleteListener(null); 
      metronome.start(); 
      metronome.setOnCompletionListener(null); 
     } 
    } 
}); 

postDelayed()执行Runnable内部的代码在第二个参数(timetw)中通过毫秒数之后。

+0

它说,methode postDelayed没有为MediaPlayer声明。 – 2013-03-14 19:01:55

+0

对不起,我的意思是'metronomepp.postDelayed()'。 – Sam 2013-03-14 19:04:31