[android]定期更新的文本而不显示

标签: Java Android
发布时间: 2017/3/19 18:05:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 for 循环我想调用 setText 方法。这工作没有任何错误的文本不会更改直到事实 script 完成运行。我要它做的是更改代码每个 time 我调用 setText 方法。我附上我下面的代码,它应该是相当海峡向前。 代码︰

package com.example.zoe.andone;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void startLoop(View view) {
        String string = getString(R.string.hello);
        ((TextView)findViewById(R.id.hello)).setText("starting...");
        for (int i = 0; i < 10; i++) {
            String updated = Integer.toString(i);
            ((TextView)findViewById(R.id.hello)).setText(updated);
            try {
                Thread.sleep(250);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
        ((TextView)findViewById(R.id.hello)).setText("done!");
    }
}

解决方法 1:

这就所谓的"删除帧"。

它有 time 学会 !

在去之前的答案,让我们解释什么。

您可能已经知道, android 有 60 fps (每秒 60 帧),这意味着每 1/60 秒呈现屏幕并显示给用户 (以提供最好的定义) 帧速率。它是通过在您的应用程序 (和其他地方一样,那里有东西要呈现) 上运行一些渲染代码每 1/60 秒来计算如何显示的屏幕应该看起来像在这个特定的 ms (它是称为帧)。

然而,在 UI 线程上运行这段代码做那件事,如果你正在做什么,当绘制刻度线踢中, android 框架只是下降的该帧 (它不会计算它)。 你的情况 Thread.sleep(250); 是什么你要删除的帧会引起它的原因持有 250 毫秒的 UI 线程在每次迭代中你 for 循环 (所以它是 250 毫秒 * (10-1),这是很多帧)。

删除帧就意味着在 UI 上看到没有更新。

解决方案

而不是使用 Thread.sleep(250); 和丢失帧,您应该安排您更新任务运行每 250 的女士就是这样。

private int i = 0; // Does the trick!
public void startLoop(View view) {
    String string = getString(R.string.hello);
    ((TextView)findViewById(R.id.hello)).setText("starting...");
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (i < 10) {
                    String updated = Integer.toString(i);
                    i++;
                    updateHelloOnUiThread(updated);
                } else {
                    updateHelloOnUiThread("done!");
                    handler.removeCallbacksAndMessages(null);
                    i = 0; // For future usages
                }
            }
        },250);
}

private void updateHelloOnUiThread(final String text) {
     MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ((TextView)findViewById(R.id.hello)).setText(text);
            }
     });
}

进一步阅读

Android用户界面︰ 固定跳过帧

高性能 Android 应用程序,第 4 章。屏幕和用户界面性能

官方微信
官方QQ群
31647020