#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
.