CountDownTimer在一个单独的Class中,在调用片段上给Handler发送消息

时间:2017-10-28 12:16:19

标签: java android android-fragments

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

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;

}

1 个答案:

答案 0 :(得分:0)

谢谢,解决但我仍然无法弄明白。 我确实将Handler添加到CountDownTimer类的构造函数中 所以我从Fragment类中引用了Handler。 它现在有效。 我仍然认为,因为这两个类住在同一个线程上, 没有This,处理程序应该是共同的。 猜猜我错过了这个概念。 谢谢@Juan