Android Studio线程处理程序

时间:2016-04-23 16:45:17

标签: java android multithreading

我试图制作一个程序,当我按下按钮时,它会显示我的arduino汽车的速度和行进的距离。我试图在TextView中不断更新距离。

这是我在onCreate()中初始化Handler,它应该将我的TextView文本设置为距离:

mHandler = new Handler() {
        public void handleMessage(Message msg) {
            Bundle bundle = msg.getData();
            String stringss = bundle.getString("myKey");
            tv2 = (TextView) findViewById(R.id.zval);
            tv2.setText("Distance is :  " + stringss);
        }
    };

这是我在后台完成工作的主题

btnDist.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Runnable runnable = new Runnable() {
                public void run() {
                    Message msg = mHandler.obtainMessage();
                    Bundle bundle = new Bundle();
                    int distance = distanta(); //function that returns distance/secound
                    int dist = 0;
                    while(distance > 0) {
                        try {
                            Thread.sleep(1000);                 //1000 milliseconds is one second.
                        } catch (InterruptedException ex) {
                            Thread.currentThread().interrupt();
                        }

                        dist += distance;
                    }
                        String dateString = String.valueOf(dist);
                        msg(dateString);
                        bundle.putString("myKey", dateString);
                        msg.setData(bundle);
                        mHandler.sendMessage(msg);

                }
            };
            Thread mythread = new Thread(runnable);
            mythread.start();
        }
    });

应用程序运行并且不会崩溃,但我的textview根本没有更新。    我是java线程的新手,所以我可能做错了什么。谢谢!

3 个答案:

答案 0 :(得分:0)

试试这个以找到arduino旅行的时间:

TextView TimerBox;
long startTime = 0;

Handler timerHandler = new Handler();

//this updates the textbox
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() {
        long millis = System.currentTimeMillis() - startTime;
        int seconds =  (int) (millis / 1000);
        int decis = (int) ((millis % 1000)/10);

        TimerBox.setText(String.format("Time: %d.%02d", seconds, decis));
        timerHandler.postDelayed(this, 10);
    }
};

这会初始化一个具有特定功能的新处理程序,该功能将更新计时器textview。

如果您希望它运行,请编码:

startTime =  System.currentTimeMillis();

timerHandler.postDelayed(timerRunnable, 0);

当你希望它停止时,请使用:

timerHandler.removeCallbacks(timerRunnable);

此解决方案将要求您根据速度和加速度计算自己行进的距离。

答案 1 :(得分:0)

它不起作用的原因是因为Handler在默认情况下创建它的线程上运行消息处理程序。在您的示例中,这是线程mythread。这意味着您正在尝试从与通常不起作用的UI线程不同的线程更新UI。

可以通过指定处理程序应运行的Looper来修复它,例如mHandler = new Handler(Looper.getMainLooper()) {

答案 2 :(得分:0)

对不起,这是一个误解。那不是我的代码,我唯一的代码就是这个

    if(seconds == 2){
seconds = 0;
decis = 0;
}

我不能评论Chi-Young Jeffrey Lii的答案,因为我的代表还不够,我只是想知道如何阅读秒变量