Изменить элементы интерфейса по потокам в Android - PullRequest
0 голосов
/ 08 октября 2011

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

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

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

Ответы [ 2 ]

6 голосов
/ 08 октября 2011

Одним из способов является использование 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".

0 голосов
/ 08 октября 2011

Читайте в блоге о безболезненном потоке . В основном изменения в пользовательском интерфейсе должны происходить в потоке пользовательского интерфейса. Статья описывает несколько способов достижения этого. ИМО в вашем случае было бы лучше использовать AsyncTask.

...