Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个单独的类中使用CountDownTimer,并向调用片段上的处理程序发送消息_Java_Android_Android Fragments - Fatal编程技术网

Java 在一个单独的类中使用CountDownTimer,并向调用片段上的处理程序发送消息

Java 在一个单独的类中使用CountDownTimer,并向调用片段上的处理程序发送消息,java,android,android-fragments,Java,Android,Android Fragments,我知道这不是真的需要,但我想实践处理程序和消息的概念。我写了一个扩展倒计时的类。在onTick中,我向队列发送了消息,我知道这是UI队列,因为类是在片段上建立的。 在片段中,我声明了一个处理程序并重写了handleMessage,试图用消息中的计时器传递更新TextView。 在这两个类(UI片段和倒计时)中,hander都得到了getMainLooper,尽管我认为它们都已经在UI线程上了。 虽然我看到消息被发送,但我发现片段上的文本视图没有更新。 请帮我看看我在这里遗漏了什么 public

我知道这不是真的需要,但我想实践处理程序和消息的概念。我写了一个扩展倒计时的类。在onTick中,我向队列发送了消息,我知道这是UI队列,因为类是在片段上建立的。 在片段中,我声明了一个处理程序并重写了handleMessage,试图用消息中的计时器传递更新TextView。 在这两个类(UI片段和倒计时)中,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;

}

谢谢,已经解决了,但我还是不明白。 我确实向CountDownTimer类的构造函数添加了处理程序 因此,我引用片段类中的处理程序。 现在可以了。 我仍然认为,因为这两个类生活在同一条线上, 如果没有此选项,则处理程序应该对两者都通用。 我想我误解了这个概念。
谢谢@Juan

问题出在哪?你有什么错误吗?没有,我在留言里放了一个日志,但它从来没有显示。。。它们好像不在同一个线程或循环上,尽管我知道它们应该在同一个线程或循环上,并且两个处理程序(片段类和倒计时类)都得到了主循环器@JuanSo问题是消息没有显示?片段上的文本视图没有更新,尽管计时器确实工作。。。消息中的日志确实显示了计时器。设置文本后,查看guitarExerciseTimer.invalidate()是否起作用。不要忘记处理程序的主要用途是从不同线程使用它们。您现在所做的事情可以通过使用observer模式的回调轻松完成。