Android“Skipped XX frames!”

时间:2014-11-17 02:59:08

标签: java android multithreading thread-sleep

所以我正在学习如何开发Android应用程序。  我试图让这个程序快速刷新一些字母,一次一个 在textView上,但是当我在我的Android设备上尝试这个并且它不起作用时,我得到消息“I / Choreographer:跳过57帧!应用程序可能在其主线程上做了太多工作。” (AttetionalBlinkTrial是一个有一个名为“blinkList”的字段的类,它是一个字符串的ArrayList)

public void startTask(View view) throws InterruptedException {
    TextView textView = (TextView) findViewById(R.id.display);
    AttentionalBlinkTrial theTrial = new AttentionalBlinkTrial();
    theTrial.generateTargets();
    theTrial.generateBlinkList(5);
    for (int i = 0; i <= 5; i++) {
        textView.setText(theTrial.getBlinkList().get(i));
        Thread.sleep(40);
        textView.setText(");
        Thread.sleep(40);
    }
}

2 个答案:

答案 0 :(得分:2)

Thread.sleep使UI线程无法访问。您应该使用Handler类。抱歉,由于我在移动设备上,因此我无法提供任何代码,但这很简单。如果我记得正确&#34; postDelayed&#34;方法就是你所需要的。

public void blink(TextView textView) {
    if (textView.getText() == "Blink!") {
        textView.setText("");
    } else {
        textView.setText("Blink!");
    }
}

public void blinkingTask() throws InterruptedException {
    final Handler handler = new Handler();
    final TextView textView = (TextView) findViewById(R.id.my_text);
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            blink(textView);
        }
    };

    for (int i = 0; i <= 5; i++) {
        handler.postDelayed(runnable, 1000 + (i * 1000)); // 5 delayed actions with 1000 ms interval.
    }
}

答案 1 :(得分:0)

看一看 Update UI from Thread。 你应该在单独的线程上进行所有操作

AttentionalBlinkTrial theTrial = new AttentionalBlinkTrial();
theTrial.generateTargets();
theTrial.generateBlinkList(5);

并且只在UI线程上设置文本。