1

以下のコードを実行するとすぐに、メディアが60秒間再生され、「残念ながら、YourAPPが停止しました」というエラーでアプリが閉じます。。「bv.setImageResource(R.drawable.play);」を削除した場合 最終的にブロックすると、アプリは完全に機能します。

finallyブロックのbv.setImageResource(R.drawable.play)の問題は何ですか?

これは私のコードです

bv = (ImageButton) findViewById(R.id.imageButton1);
private void mpsleep() {
    mp.start();
    Thread timer= new Thread(){
        public void run(){
            try{
                for (i =1;i<60;i++){
                    sleep(1000);//1 second pause
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                mp.pause();
                mp.seekTo(0);
                bv.setImageResource(R.drawable.play);
            }
        }
    };
    timer.start();
}

LogCat

03-06 11:03:39.743: V/MediaPlayer(31802): message received msg=4, ext1=0, ext2=0
03-06 11:03:39.743: V/MediaPlayer(31802): Received seek complete
03-06 11:03:39.743: V/MediaPlayer(31802): All seeks complete - return to regularly scheduled program
03-06 11:03:39.743: V/MediaPlayer(31802): callback application
03-06 11:03:39.743: V/MediaPlayer(31802): back from callback
03-06 11:03:39.743: E/MediaPlayer(31802): mOnSeekCompleteListener is null. Failed to send MEDIA_SEEK_COMPLETE message.
03-06 11:03:40.918: V/MediaPlayer(31802): isPlaying: 1
03-06 11:03:40.918: V/MediaPlayer-JNI(31802): isPlaying: 1
03-06 11:03:40.918: V/MediaPlayer-JNI(31802): pause
03-06 11:03:40.918: V/MediaPlayer(31802): pause
03-06 11:03:40.923: V/MediaPlayer-JNI(31802): seekTo: 0(msec)
03-06 11:03:40.923: V/MediaPlayer(31802): seekTo 0
03-06 11:03:40.923: V/MediaPlayer(31802): getDuration
03-06 11:03:40.923: V/MediaPlayer(31802): message received msg=4, ext1=0, ext2=0
03-06 11:03:40.923: W/dalvikvm(31802): threadid=11: thread exiting with uncaught exception (group=0x40c541f8)
03-06 11:03:40.923: V/MediaPlayer(31802): Received seek complete
03-06 11:03:40.923: V/MediaPlayer(31802): All seeks complete - return to regularly scheduled program
03-06 11:03:40.923: V/MediaPlayer(31802): callback application
03-06 11:03:40.923: V/MediaPlayer(31802): back from callback
03-06 11:03:40.928: E/MediaPlayer(31802): mOnSeekCompleteListener is null. Failed to send MEDIA_SEEK_COMPLETE message.
03-06 11:03:40.953: E/AndroidRuntime(31802): FATAL EXCEPTION: Thread-20100
03-06 11:03:40.953: E/AndroidRuntime(31802): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4286)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:885)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.View.requestLayout(View.java:12881)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.View.requestLayout(View.java:12881)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.View.requestLayout(View.java:12881)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.View.requestLayout(View.java:12881)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.View.requestLayout(View.java:12881)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.view.View.requestLayout(View.java:12881)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at android.widget.ImageView.setImageResource(ImageView.java:316)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at com.hello.YourApp.MainActivity.stopsound(MainActivity.java:118)
03-06 11:03:40.953: E/AndroidRuntime(31802):    at com.hello.YourApp.MainActivity$6.run(MainActivity.java:143)
03-06 11:03:46.068: D/OpenGLRenderer(31802): Flushing caches (mode 0)
4

3 に答える 3

5

例外メッセージはそれを明確に示しています:

android.view.ViewRootImpl $ CalledFromWrongThreadException:ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

別のスレッドからUI要素にアクセスすることはできません。削除する

setImageResource(R.drawable.play) 

からrun()

UIスレッドで実行する必要のある小さなコード(Activityクラス内)がある場合は、Activityで次のメソッドを使用できます。

runOnUiThread(new Runnable(){
  @override
  public void run(){
    //-- put code here--
  }
});
于 2013-03-06T05:56:37.173 に答える
3

次のコードで示したように、UIスレッドを使用します。

    bv = (ImageButton) findViewById(R.id.imageButton1);
private void mpsleep() {
    mp.start();
    Thread timer= new Thread(){
        public void run(){
            try{
                for (i =1;i<60;i++){
                    sleep(1000);//5 second pause
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                mp.pause();
                mp.seekTo(0);
        runOnUiThread(new Runnable() {

        @Override
        public void run() {
                bv.setImageResource(R.drawable.play);

        }
    });
            }
        }
    };
    timer.start();
}

説明:

->で実行されるまたはメソッドbv = (ImageButton) findViewById(R.id.imageButton1);内に記述した可能性があります。onCreateonResumeMain thread(UI thread)

->新しいスレッドThread timer= new Thread()を作成し、コンポーネントを操作しようとしていますが、bvバインドbvされているため、問題が発生しています。Main Thread(UI thread)解決するには、runOnUiThread(new Runnable)メソッドを使用するだけです。

お役に立てば幸いです!

于 2013-03-06T06:05:03.043 に答える
1

ハンドラーを使用してコードを実行しますbv.setImageResource(R.drawable.play);

于 2013-03-06T05:57:19.370 に答える