【问题标题】:Issue with Try and Catch on AndroidAndroid 上的 Try and Catch 问题
【发布时间】:2013-03-06 05:48:58
【问题描述】:

我执行以下代码后,媒体播放 60 秒,我的应用程序关闭并显示错误“不幸的是,YourAPP 已停止。” .如果我删除“bv.setImageResource(R.drawable.play);”在 finally 块上,该应用程序运行良好。

bv.setImageResource(R.drawable.play) 在 finally 块上有什么问题??

这是我的代码

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)

【问题讨论】:

  • 发布 logcat 并让您初始化 bv。
  • 发布 logcat.. 我猜你可能在 bv 上遇到空指针异常
  • 什么是bv??(哪个控件的对象)
  • 你在哪里初始化 bv?看起来 bv 在这里可能为空
  • E/AndroidRuntime(31802): android.view.ViewRootImpl$CalledFromW rongThreadException: 只有创建视图层次结构的原始线程才能接触其视图。

标签: android caching try-catch try-catch-finally finally


【解决方案1】:

异常信息说得很清楚:

android.view.ViewRootImpl$CalledFromWrongThreadException: 只有 创建视图层次结构的原始线程可以触及其视图。

您无法从单独的线程访问 UI 元素。删除

setImageResource(R.drawable.play) 

来自run()

如果有一点代码(Activity 类内部)需要在 UI 线程上运行,您可以在 Activity 中使用此方法:

runOnUiThread(new Runnable(){
  @override
  public void run(){
    //-- put code here--
  }
});

【讨论】:

  • @SaiKiran 您可以在答案末尾用示例代码包装setImageResource(R.drawable.play)
【解决方案2】:

使用我在以下代码中显示的 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();
}

说明:

-> 您可能在 onCreateonResume 方法中写入了 bv = (ImageButton) findViewById(R.id.imageButton1);,该方法在 Main thread(UI thread) 上运行。

-> 您创建了一个新线程Thread timer= new Thread() 并尝试操作组件bv。但是bv 绑定到Main Thread(UI thread)。所以您遇到了麻烦。要解决它,只需使用runOnUiThread(new Runnable)方法。

希望对你有帮助!

【讨论】:

  • 很高兴为您提供帮助。如果有帮助,请给我投票。我已编辑答案,添加“说明”以消除您的疑问。
【解决方案3】:

使用处理程序运行您的代码 bv.setImageResource(R.drawable.play);

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2012-04-29
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多