2016-04-23 148 views
0

我试图做一个程序,当我按下按钮时,它会显示我的arduino汽车的速度和行驶距离。我试图不断更新TextView中的距离。Android Studio线程处理程序

这里是我的处理程序中的onCreate()应当设置我的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线程,所以我可能做错了什么。谢谢!

回答

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); 

该解决方案将要求您计算行驶距离自己基于速度和加速度。

+0

这非常有帮助,谢谢你的答案。 –

0

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

它可以通过指定在其上处理程序应运行Looper,像mHandler = new Handler(Looper.getMainLooper()) {

+0

它没有工作,距离变量应该加上当前距离,只要汽车继续行驶,值应该继续增加。我制定了一个计时器,并多次提供赛车的速度和时间来获得距离。谢谢你的回答和你的时间! –

0

对不起,这是一种误解是固定的。这不是我的代码,我唯一的代码仅在智扬杰弗里吕的回答这个

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

我只是无法评论,因为我的代表处是不够的,我只是想知道如何阅读可变

+0

他没有提供问题的答案。一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你将可以在任何帖子上[评论](http://stackoverflow.com/help/privileges/comment)。另外检查这[我可以做什么,而不是](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an-i-do-instead )。 – thewaywewere