Android计时器更新文本视图(UI)

时间:2011-07-14 22:38:52

标签: java android timer

我正在使用计时器来制作秒表。计时器通过增加整数值来工作。我想通过不断更新textview在活动中显示此值。

这是我尝试更新活动的textview的服务代码:

protected static void startTimer() {
    isTimerRunning = true; 
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            elapsedTime += 1; //increase every sec
            StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview
        }
    }, 0, 1000);
}

我在错误的帖子中更新了UI时遇到了一些错误。

如何调整代码以完成不断更新textview的任务?

9 个答案:

答案 0 :(得分:88)

protected static void startTimer() {
    isTimerRunning = true; 
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            elapsedTime += 1; //increase every sec
            mHandler.obtainMessage(1).sendToTarget();
        }
    }, 0, 1000);
}

public Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview
    }
};

以上代码将有效......

注意:必须在主线程中创建处理程序,以便您可以修改UI内容。

答案 1 :(得分:8)

您应该使用Handler来每隔X秒更新一次UI。这是另一个显示示例的问题:Repeat a task with a time delay?

您的方法不起作用,因为您尝试从非UI线程更新UI。这是不允许的。

答案 2 :(得分:6)

StopWatch.time.post(new Runnable() {
    StopWatch.time.setText(formatIntoHHMMSS(elapsedTime));
});

此代码块基于Handler,但您无需创建自己的Handler实例。

答案 3 :(得分:2)

TimerTask实现了Runnable,这将使它成为一个线程。如果没有一些工作,您无法直接从其他线程更新主UI线程。 您可以做的一件事是使用异步任务创建计时器并每秒发布一次更新UI的更新。

答案 4 :(得分:2)

我假设StopWatch.time是对TextView的一些静态或公共引用。您应该实现BroadcastReceiver以在您的计时器(从单独的线程运行)和TextView之间进行通信,而不是这样做。

答案 5 :(得分:2)

您可以使用以下实用程序:

.js

然后,在UI线程运行的代码中的任何地方,您都可以像这样使用它:

/**
 * Created by Ofek on 19/08/2015.
 */
public class TaskScheduler extends Handler {
    private ArrayMap<Runnable,Runnable> tasks = new ArrayMap<>();
    public void scheduleAtFixedRate(final Runnable task,long delay,final long period) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                task.run();
                postDelayed(this, period);
            }
        };
        tasks.put(task, runnable);
        postDelayed(runnable, delay);
    }
    public void scheduleAtFixedRate(final Runnable task,final long period) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                task.run();
                postDelayed(this, period);
            }
        };
        tasks.put(task, runnable);
        runnable.run();
    }
    public void stop(Runnable task) {
        Runnable removed = tasks.remove(task);
        if (removed!=null) removeCallbacks(removed);
    }

}

答案 6 :(得分:1)

您可以使用 Handler

此代码每隔一秒增加一个计数器,并在 textView 显示和更新计数器值。

public class MainActivity extends Activity {


    private Handler handler = new Handler();
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        startTimer();
    }


    int i = 0;
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            i++;
            textView.setText("counter:" + i);
            startTimer();
        }
    };

    public void startTimer() {
        handler.postDelayed(runnable, 1000);
    }

    public void cancelTimer() {
        handler.removeCallbacks(runnable);
    }

    @Override
    protected void onStop() {
        super.onStop();
        handler.removeCallbacks(runnable);
    }
}

答案 7 :(得分:0)

我使用这种方式:

String[] array={ "man","for","think" }; int j 然后添加更多onCreate

TextView t = findViewById(R.id.textView);

    new CountDownTimer(5000,1000) {

        @Override
        public void onTick(long millisUntilFinished) {}

        @Override
        public void onFinish() {
            t.setText("I "+array[j] +" You");
            j++;
            if(j== array.length-1) j=0;
            start();
        }
    }.start();

答案 8 :(得分:-3)

 timer.schedule(new TimerTask() {
            @Override
            public void run() {

                //your actions

            }
        },1*1000);//1 sec