Android致命信号11(SIGSEGV)runOnUiThread

时间:2015-07-30 12:29:10

标签: android multithreading

我正在尝试在屏幕上制作一个简单的狗爪子Android动画。我这样做是通过制作一个带有6个狗爪的XML屏幕,并在代码中设置每个爪子的可见性。代码的组织方式是UI线程可以在每500ms更改可见性。经过10个周期后,我尝试启动一个新的Activity。此时我得到异常,我的应用程序重新启动。可能有什么问题?有我的代码片段:

Thread UI_thread = new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
                try {
                    //Thread.sleep(300);

                    while (cnt < 11) {


                     Thread.sleep(500);



                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                             if (cnt == 10) {
                                 // Start second screen
                                 Img1.setVisibility(View.INVISIBLE);
                                 Img2.setVisibility(View.INVISIBLE);
                                 Img3.setVisibility(View.INVISIBLE);
                                 Img4.setVisibility(View.INVISIBLE);
                                 Img5.setVisibility(View.INVISIBLE);
                                 Img6.setVisibility(View.INVISIBLE);
                                 Intent IntroScreen2Act = new Intent(IntroScreen1.this, IntroScreen2.class);
                                 startActivity(IntroScreen2Act);

                             }

                            switch (cnt) {
                            case 0:
                                Img1.setVisibility(View.VISIBLE);
                                break;

                            case 1:
                                Img2.setVisibility(View.VISIBLE);
                                break;

                            case 2:
                                Img3.setVisibility(View.VISIBLE);
                                break;

                            case 3:
                                Img4.setVisibility(View.VISIBLE);
                                break;

                            case 4:
                                Img5.setVisibility(View.VISIBLE);
                                break;

                            case 5:
                                Img6.setVisibility(View.VISIBLE);
                                break;

                            }

                        }
                    });
                     cnt ++;
                     Log.d("Thread", "Cycle " + Integer.toString(cnt));
                    }
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }

    });


    UI_thread.start();

LogCat:

07-30 14:19:34.082: E/dalvikvm-heap(22071): Out of memory on a 44049616-byte allocation. 07-30 14:19:34.102: A/libc(22071): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 22071

1 个答案:

答案 0 :(得分:0)

当您调用runOnUiThread()时,代码不会立即运行。它只是作为请求添加到显示线程的消息队列中。所以它将在“稍晚”执行,操作系统决定何时“稍晚”。

最大的问题是你正在启动一个后台线程,它使用runOnUiThread()来访问主线程,这很好,但是一旦调用了startActivity(),当前的UI线程就会被破坏。但

  1. setVisibility(View.INVISIBLE)正在排队/调用
  2. 当前的UI线程被“删除”/“从堆栈中取出”,因为调用了startActivity()
  3. 您没有调用finish()或返回显式告诉系统现在结束活动,因此其余的run()方法仍在执行中。这意味着UI线程可能仍然很忙,startActivity()将在“稍后”生效。
  4. 我的猜测是上述3个项目的组合导致在操作系统开始清理之后访问UI线程,因此段错误即视图被引用太晚