CountDownTimer在一个单独的类与消息处理程序在调用片段

问题描述:

我知道这不是真的需要,但我想练习处理程序和消息的概念。我写了一个扩展CountDownTimer的类。在onTick中,我将消息发送到Queue,并且我知道这是UI队列,因为Class已经在Fragment上安装了。 在片段中,我声明了Handler并覆盖了handleMessage,尝试使用消息中的定时器传递来更新TextView。 在这两个分类 - UI片段和CountDown中,hander获取getMainLooper,尽管我认为它们都已经在UI线程中。 虽然我看到了正在发送的消息,但我没有更新片段上的文本视图。 请帮我看看我在这里失踪。CountDownTimer在一个单独的类与消息处理程序在调用片段

public class GuitarExerciseTimer extends CountDownTimer { 

    Handler mHandler = new Handler(Looper.getMainLooper()); 

    public void onTick(long millisUntilFinished) { 

      final String guitarExerciseTimerS = String.format(Locale.getDefault(), "Time Remaining %02d min: %02d sec", 
        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60, 
        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60); 


      Message completeMessage = Message.obtain(); 
      completeMessage.obj = guitarExerciseTimerS; 
      // completeMessage.setTarget(mHandler); 
      Log.d("TEST","prepare message" + " " + guitarExerciseTimerS); 
      //completeMessage.sendToTarget() 
      mHandler.sendMessage(completeMessage); 

      ; 
     } 

    public class GuitarFocusedExerciseFragment extends Fragment{ 

     GuitarExerciseTimer timer = new GuitarExerciseTimer (30000, 1000); 
     Handler handler = new Handler(Looper.getMainLooper()) { 

      @Override 
      public void handleMessage(Message msg) { 
       Log.d ("TEST","Inside handelMessage"); 
       String timer = (String) msg.obj; 
       guitarExerciseTimer.setText(timer); 
      } 
     }; 

     TextView guitarExerciseTimer; 

} 
+0

这是问题所在?你有任何错误? – Juan

+0

不,我把一个Log放在HandelMessage里面,但它永远不会显示...它就像它们不在同一个线程或循环中一样,但我知道它们假设是两个处理程序(fragment和countdown类)都获得mainLooper。 @Juan – amir

+0

所以问题是,消息不显示? – Juan

谢谢,解决了,但我仍然无法弄清楚。 我没有将处理程序添加到CountDownTimer类的构造函数 ,所以我引用了片段类中的Handler。 现在有效。 我仍然认为,因为这两个类生活在相同的线程, 处理程序应该是没有这个共同。 猜猜我误解了这个概念。 谢谢@Juan

+0

不要忘记,处理程序的主要用途是从不同的线程使用它们。你现在所做的事情可以通过使用观察者模式的回调来轻松完成。 – Juan