2013-10-03 4 views
4

Я написал небольшое приложение, которое меняет фон приложения каждые 3 секунды. Для этого я использовал объект Handler и Runnable. Он работает нормально. Вот мой код:Будет ли handler.post (новый Runnable()); создать новую тему в Android?

public class MainActivity extends Activity { 

     private RelativeLayout backgroundLayout; 
     private int count; 
     private Handler hand = new Handler(); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      Button clickMe = (Button) findViewById(R.id.btn); 

      backgroundLayout = (RelativeLayout) findViewById(R.id.background); 

      clickMe.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 

        count = 0; 

        hand.postDelayed(changeBGThread, 3000); 

       } 
      }); 

     } 

private Runnable changeBGThread = new Runnable() { 

     @Override 
     public void run() { 

      if(count == 3){ 
       count = 0; 
      } 

      switch (count) { 
      case 0: 
       backgroundLayout.setBackgroundColor(getResources().getColor(android.R.color.black)); 
       count++; 
       break; 

      case 1: 
       backgroundLayout.setBackgroundColor(Color.RED); 
       count++; 
       break; 

      case 2: 
       backgroundLayout.setBackgroundColor(Color.BLUE); 
       count++; 
       break; 

      default: 
       break; 
      } 

      hand.postDelayed(changeBGThread, 3000); 

     } 
    }; 
} 

Здесь я меняю фон UI в не-UI потоке, т.е. backgroundLayout.setBackgroundColor(Color.RED); внутри бег(); как он работает?

ответ

13

Runnable не является фоновым потоком, это единица работы, которая может выполняться в заданном потоке.

Обработчик не создает новый поток, он привязывается к петлевому механизму потока, который он создает (основной поток в этом случае), или к петлеукладчику, который вы даете ему во время строительства.

Таким образом, вы ничего не работаете в фоновом потоке, вы просто очереди сообщения на обработчик для запуска на более поздний момент времени, в основном потоке

+0

Спасибо, Как я прочитал здесь HTTP: //developer.android.com/reference/android/os/Looper.html Темы по умолчанию не имеют связанного с ними цикла сообщений. Мы должны создать его, вызвав команду prepare(). Тогда основной поток имеет Looper по умолчанию, bcoz я не создал ни одного петлителя в своем приложении. – Pradeep

+3

Да, основной поток ui имеет связанный с ним петлитель, и вы можете получить его с помощью Looper.getMainLooper() (что полезно, если вы хотите проверить, какой обработчик связан с обработчиком) – FunkTheMonk

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