Почему setBackgroundColor на макете иногда приводит к сбою моего приложения - PullRequest
1 голос
/ 05 августа 2011

Я создаю приложение, которое может отправлять и получать 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 - линейный вывод

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: поток завершается с необработанным исключением (группа = 0x4001d7d0) ОШИБКА / AndroidRuntime (18083): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: Thread-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 (View.java:7429) ОШИБКА / AndroidRuntime (18083): в com.taprik.Remote.RemoteMain $ 4.acceptMessage (RemoteMain.java:202) ОШИБКА / AndroidRuntime (18083): на com.illposed.osc.utility.OSCPacketDispatcher.dispatchMessage (Неизвестный источник) ОШИБКА / AndroidRuntime (18083): на com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket (Неизвестный источник) ОШИБКА / AndroidRuntime (18083): на com.illposed.osc.utility.OSCPacketDispatcher.dispatchBundle (Неизвестный источник) ОШИБКА / AndroidRuntime (18083): на com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket (Неизвестный источник) ОШИБКА / AndroidRuntime (18083): на com.illposed.osc.OSCPortIn.run (неизвестный источник) ОШИБКА / AndroidRuntime (18083): на java.lang.Thread.run (Thread.java:1096) WARN / ActivityManager (6722): принудительно завершить действие com.taprik.Remote / .RemoteMain

1 Ответ

1 голос
/ 05 августа 2011

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);
        }
    }
}
...