2017-10-28 8 views
-1

私はこれが本当に必要ではないと知っていますが、ハンドラーとメッセージの概念を練習したいと思います。 CountDownTimerを拡張したクラスを書きました。 onTickでは、私はメッセージをキューに送りました、クラスがフラグメント上にinstatiatedされているので、それはUIキューだと私は知っています。 Fragment IでHandlerを宣言し、handleMessageをオーバーライドして、TextViewをメッセージのタイマーパスで更新しようとしました。 UIフラグメントとCountDownの両方で、ハンドラは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

いいえ、私はHandelMessageの中にログを入れましたが、それは決して同じスレッドやループではないと思いますが、ハンドラ(フラグメントとカウントダウンクラス)がmainLooperを取得すると思います。 @元 – amir

+0

だから問題は、メッセージが表示されないということですか? – Juan

答えて

0

ありがとう、解決済みですが、まだ解決できません。 ハンドラをCountDownTimerクラス のコンストラクタに追加しました。そのため、フラグメントクラスからハンドラを参照しています。 これで動作します。 まだ私は、これらの2つのクラスが同じスレッド上にあるので、 ハンドラはthisなしで共通でなければならないと考えました。 私はそのコンセプトを忘れてしまったと思います。 @Juanに感謝します

+0

Handlersの主な用途は、異なるスレッドからハンドラを使用することです。あなたが今行ったことは、オブザーバパターンを使ってコールバックを使って簡単に行うことができます。 – Juan

関連する問題