1

我正在构建一个可以发送和接收 OSC 的应用程序。我正在使用 JavaOSC,它完全符合我的需求。

我在 OSC 消息中发送颜色值,也接收它们。

我从基于此颜色选择器 http://code.google.com/p/color-picker-view/的颜色选择器发送颜色 ,效果很好。

我的问题是:

  • 当我在颜色选择器中选择颜色时,我正在设置布局的背景(颜色选择器所在的位置)视图:

私有 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) 错误/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.

4

1 回答 1

1

android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸其视图。

您只能在 UI 线程上更改 UI 元素: 注意:在 UI 线程上执行的任何操作都会阻止其他 UI 操作。因此,如果您在 UI 线程上的一些长列表中循环,则用户在它发生时无法与 UI 交互。

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);
        }
    }
}
于 2011-08-05T14:12:40.313 回答