Почему setBackgroundColor на макете иногда приводит к сбою моего приложения
Я создаю приложение, которое может отправлять и получать OSC. Я использую JavaOSC, он отлично отвечает моим потребностям.
Я посылаю значение цвета в сообщении OSC, и получаю их также.
Я отправляю цвет из палитры цветов на основе этого палитры http://code.google.com/p/color-picker-view/ он отлично работает.
Моя проблема:
- Когда я выбираю цвет в палитре цветов, я устанавливаю фон макета (где палитра цветов) с помощью:
private ColorPickerView.OnColorChangedListener colorListener = new ColorPickerView.OnColorChangedListener () {
@Override
public void onColorChanged(int color) {
caller.sending("color", color);
mScreen.setBackgroundColor(color);
}
};
где mScreen - это LinearLyout
mScreen = (LinearLayout) findViewById (R.id.myScreen);
Работает как положено.
- Когда я получаю сообщение OSC с цветом, я бы тоже хотел изменить фон, но он вылетает.
Мой слушатель
Прослушиватель OSCListener = новый OSCListener() {
public void acceptMessage(java.util.Date time, OSCMessage message) {
//en cas de message vide
if (message.getArguments().length == 0) return;
//sinon on recupere les elements et on les tries
Object[] args = message.getArguments();
if (args[0].toString().contains("alpha")) Log.i("receiver osc", "Message received!");
//Instructions
if (args[0].toString().contains("color")) {
int color = (Integer)args[1];
//mColorPickerView.setColor((Integer)args[1]);
mScreen.setBackgroundColor(color);
}
else return;
}
Вы можете найти отчет о сбое ниже. Должна ли функция setBackgroundColor находиться в определенной функции для правильной работы (например, в функции onClick) или когда она перерисовывает что-то на экране?
Отчет о сбое
08-05 15:18:15.035: WARN/dalvikvm(18083): threadid=7: выход из потока с неперехваченным исключением (group=0x4001d7d0) ERROR/AndroidRuntime(18083): FATAL EXCEPTION: Ошибка потока-8 /AndroidRuntime(18083): android.view.ViewRoot$CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений. ОШИБКА / AndroidRuntime (18083): в android.view.ViewRoot.checkThread(ViewRoot.java:2811) ОШИБКА / AndroidRuntime (18083): в android.view.ViewRoot.requestLayout(ViewRoot.java:594) ОШИБКА / AndroidRuntime (18083): в android.view.View.requestLayout(View.java:8180) ОШИБКА / AndroidRuntime (18083): в android.view.View.requestLayout(View.java:8180) ОШИБКА / AndroidRuntime (18083): в android.view. View.requestLayout (View.java:8180) ОШИБКА / AndroidRuntime (18083): в android.view.View.setBackgroundDrawable(View.java:7535) ОШИБКА / AndroidRuntime (18083): в android.view.View.setBackgroundColor(Просмотреть. Java:7429) ОШИБКА / AndroidRuntime (18083): в com.taprik.Remote.RemoteMain$4.acceptMessage(RemoteMain.java:202) ОШИБКА / AndroidRuntime (18083): в com.illposed.osc.utility.OSCPacketDispatcher.dispatchMessage(неизвестно) Источник) ERROR / AndroidRuntime (18083): на com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(Неизвестный источник) ERROR / AndroidRuntime (18083): на com.illposed.osc.utility.OSCPacketDispatcher.dispatchBundle(Неизвестный Источник) ERROR / AndroidRuntime (18083): на com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(Неизвестный источник) ERROR / AndroidRuntime (18083): на com.illposed.osc.OSCPortIn.run(Неизвестный источник) ERROR/AndroidRuntime(18083): at java.lang.Thread.run(Thread.java:1096) WARN/ActivityManager(6722): принудительно завершить действие com.taprik.Remote/.RemoteMain
1 ответ
android.view.ViewRoot$CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений.
Вы можете изменять только элементы пользовательского интерфейса в потоке пользовательского интерфейса:Примечание. Все, что выполняется в потоке пользовательского интерфейса , блокирует другие действия пользовательского интерфейса. Следовательно, если вы просматриваете длинный список в потоке пользовательского интерфейса, пользователь не может взаимодействовать с пользовательским интерфейсом, пока он происходит.
MyActivity.this.runOnUiThread(new Runnable() {
public void run() {
mScreen.setBackgroundColor(color);
}
});
Или же:
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
/* ... */
// Create the handler
mHandler = new Handler();
}
private void changeBgColor(final int color) {
mHandler.post(new Runnable() {
public void run() {
mScreen.setBackgroundColor(color);
}
}
}