使用计时器 - 如何?

时间:2017-11-01 18:34:00

标签: java android

我的计时器出了问题。 2秒后而不是这个动作我收到一个错误。

public class MainActivity extends AppCompatActivity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        tv = (TextView)findViewById(R.id.tv);

        Timer timer=new Timer();

        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                tv.setText("why?");
            }
        };

        timer.schedule(timerTask,2000);
    }
}

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您无法从非主线程

运行这些
        @Override
        public void run() {
            tv.setText("why?");
        }

您必须使用runOnUiThread

    @Override
    public void run() {
           runOnUiThread(new Runnable(){
                @Override
                public void run() {
                     tv.setText("why?");
                }});
           }
    }

或使用View的post方法

    @Override
    public void run() {
           tv.post(new Runnable(){
                @Override
                public void run() {
                     tv.setText("why?");
                }});
           }
    }

我知道它看起来很奇怪,但如果你用lambdas写它就会更好更简洁

timer.schedule(()->{tv.post(()->{setText("why?");}},2000);

答案 1 :(得分:0)

您无法从线程内更新UI。从主线程更新UI。

创建处理程序并在完成工作后向处理程序发送消息并更新UIthere。

Handler handler = new Handler()
{
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        // Update UI
    }
};

并使用handler.sendMessage()

向处理程序发送消息