我正在尝试在屏幕上制作一个简单的狗爪子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
答案 0 :(得分:0)
当您调用runOnUiThread()时,代码不会立即运行。它只是作为请求添加到显示线程的消息队列中。所以它将在“稍晚”执行,操作系统决定何时“稍晚”。
最大的问题是你正在启动一个后台线程,它使用runOnUiThread()来访问主线程,这很好,但是一旦调用了startActivity(),当前的UI线程就会被破坏。但
我的猜测是上述3个项目的组合导致在操作系统开始清理之后访问UI线程,因此段错误即视图被引用太晚