【问题标题】:Android "Skipped XX frames!"Android“跳过了 XX 帧!”
【发布时间】:2014-11-17 02:59:08
【问题描述】:

所以我正在学习如何开发 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);
    }
}

【问题讨论】:

    标签: java android multithreading thread-sleep


    【解决方案1】:

    Thread.sleep 使 UI 线程无法访问。您应该改用 Handler 类。抱歉,由于我在移动设备上,所以我无法提供任何代码,但这很容易。如果我记得正确的“postDelayed”方法就是你需要的。

    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.
        }
    }
    

    【讨论】:

    • Handler 不是实现 asyctasks(Asynctask、Loaders...)的唯一方法,但它足以满足您的情况。
    • 您好,感谢您的帮助!我不太确定处理程序中应该包含哪些数据以及当前方法中应该保留哪些数据。我认为设置的文本应该保留在当前方法中,因为它位于 UI 线程中,但我不确定将什么发布到处理程序。谢谢。
    • 你现在的想法不对。不过,每个人一开始都会犯这个错误没问题 :) 与其让整个应用程序“等待”,不如只“延迟”该函数的执行。所以程序的其余部分可以按计划进行。我会在几分钟后将代码添加到我的答案中。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多