从定时器功能内部更改视图

时间:2014-05-30 04:35:27

标签: java android timer

我需要将TextView设为蓝色半秒钟,然后再次变为白色(用户点击,它会闪烁蓝色)。

为此,我尝试将颜色设置为蓝色,设置500ms计时器,然后将其更改回白色。像这样:

// defining the TextView
final TextView showDatabase = new TextView(this);
showDatabase.setText("Show Database");
showDatabase.setTextColor(Color.WHITE);

// click listener
showDatabase.setOnClickListener (new View.OnClickListener() {
    public void onClick(View v) {

        showDatabase.setTextColor(Color.BLUE); // make it blue

        // wait 500ms, then make it white again
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
               showDatabase.setTextColor(Color.WHITE);
            }
        }, 500);
    }
});

logcat的:

Only the original thread that created a view hierarchy can touch its views.

我不能简单地在计时器功能中创建一个TextView实例(我认为),因为它不是布局中的元素。

如何让自己从计时器功能中操作TextView?

2 个答案:

答案 0 :(得分:2)

计时器在不同的线程上运行。你无法从那里更新ui。使用HandlerrunOnUiThread

  runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                         showDatabase.setTextColor(Color.WHITE);
                    }
                });

使用Handler

Handler m_handler;
Runnable m_handlerTask ; 
m_handler = new Handler(); 
m_handlerTask = new Runnable() 
{ 
@Override
public void run() {
  showDatabase.setTextColor(Color.WHITE); 
  m_handler.postDelayed(m_handlerTask, 500); 
 }
 };
 m_handlerTask.run();

取消

m_handler.removeCallbacks(m_handlerTask);

答案 1 :(得分:2)

在计时器中添加runOnUiThread

Timer timer = new Timer();
timer.schedule(new TimerTask() {
     @Override
     public void run() {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 // do UI updates here
             }
         });
     }
}, 500);