2016-02-26 10 views
0

Хорошо, у меня есть следующий код от https://github.com/hongyangAndroid/Android-CircleMenu. Здесь, из трассировки печати, я пришел к выводу, что конструктор запускается только один раз, тогда как метод run() рекурсивно вызывается до некоторого условия.Android: Как выглядит postDelayed (runnable, milliSeconds) с рекурсивным запуском?

Мой вопрос в том, почему метод run() рекурсивно вызывается из postDelayed(), почему не конструктор? и как переменная anglePerSecond сохраняет значение? Я хочу понять, что это поток. Спасибо вам.

//Automatic scrolling tasks 
    private class AutoFlingRunnable implements Runnable{ 
    private float anglePerSecond; 
    public AutoFlingRunnable(float velocity){ 
     this.anglePerSecond = velocity; 
    } 
    public void run(){ 
     if((int)Math.abs(anglePerSecond) < 20){ 
      isFling = false; 
      return; 
     } 
     isFling = true; 

     //anglePerSecond/30 in order to avoid rolling too fast 
     mStartAngle += (anglePerSecond/30); 
     //Gradually reduce this value 
     anglePerSecond /= 1.0666F; 
     postDelayed(this, 30); 
     //gradually reduce this value 
     requestLayout(); //re-layout views 
    } 
} 

ответ

1

Если вы хотите обновить TextView в деятельности, например, TextView с countdowntimer, обычно обновлять его с помощью следующего кода

final int time = 50; 
    final TextView textView = new TextView(this); 
    textView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      textView.setText(String.format("Remaing Time : %d s", time)); 
     } 
     /* 
     * Update it after 1 second 
     * 1秒後更新 
     */ 
    },1000); 

Если вы понимаете, приведенный выше код, то постарайтесь понять следующее:

textView.postDelayed(new Runnable() { 


     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      textView.setText(String.format("Remaing Time : %d s", time)); 
      /* 
      * Update it after 1 second 
      * 1秒後更新 
      */ 
      textView.postDelayed(this, 1000); 
     } 
     /* 
     * Update it after 1 second 
     * 1秒後更新 
     */ 
    },1000); 

Фактически, это тот же прогресс внутри библиотеки, которую вы предоставили. Это дозирование sth, как это.

1.call AutoFlingRunnable consturctor создать

2.Method вызова в строке 366

3.run AutoFlingRunnable запуск() метод

4.run тот же работоспособная перспектива() Способ после того, как 0,03 секунды в строке 574

5.Back к шагу 3

 Смежные вопросы

  • Нет связанных вопросов^_^