Изменение элементов пользовательского интерфейса по потокам в Android

#android #multithreading #user-interface #android-linearlayout

#Android #многопоточность #пользовательский интерфейс #android-linearlayout

Вопрос:

Как мне изменить фон LinearLayout с помощью setBackgroundColor() другим потоком?

Я узнал, что платформа пользовательского интерфейса Android не является потокобезопасной, поэтому вы не можете изменять элементы пользовательского интерфейса другим потоком, отличным от потока пользовательского интерфейса.

Моя цель — создать эффект стробоскопа, вызвав метод setBackgroundColor() с изменением цветов (в данном случае черный / белый / черный / ect,) в LinearLayout, который заполняет весь экран.

Ответ №1:

Один из способов — использовать Handler с очередями сообщений. Вы создаете экземпляр Handler в основном потоке пользовательского интерфейса, а затем используете obtainMessage() для отправки сообщений в Handler . Таким образом, пример может быть таким

 public final Handler updateTextView = new Handler(){
   @Override
   public void handleMessage(Message msg)
   {
      if(msg.what == UPDATE_TEXT){
          myTextView.setText("arg1 = "   msg.arg1  
                             "; arg2 = "   msg.arg2   "; "   (String)msg.obj);
      }
   }
}
  

Затем в вашем потоке вы можете вызвать:

 String myString = new String("test");
updateTextView.obtainMessage(UPDATE_TEXT, 10, 20, myString).sendToTarget();
  

Результат, если он будет вызван один раз myTextView , теперь будет гласить «arg1 = 10; arg2 = 20; test».

Ответ №2:

Прочитайте сообщение в блоге о безболезненном потоковом использовании. В основном изменения в пользовательском интерфейсе должны происходить в потоке пользовательского интерфейса. В статье описано несколько способов добиться этого. IMO в вашем случае было бы лучше использовать AsyncTask .