为什么布局上的setBackgroundColor有时会崩溃我的应用程序

时间:2011-08-05 14:09:57

标签: android layout colors setbackground

我正在构建一个可以发送和接收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 listener = new 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):致命异常:线程-8   ERROR / AndroidRuntime(18083):android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。   ERROR / AndroidRuntime(18083):在android.view.ViewRoot.checkThread(ViewRoot.java:2811)   错误/ AndroidRuntime(18083):在android.view.ViewRoot.requestLayout(ViewRoot.java:594)   ERROR / AndroidRuntime(18083):在android.view.View.requestLayout(View.java:8180)   ERROR / AndroidRuntime(18083):在android.view.View.requestLayout(View.java:8180)   ERROR / AndroidRuntime(18083):在android.view.View.requestLayout(View.java:8180)   ERROR / AndroidRuntime(18083):在android.view.View.setBackgroundDrawable(View.java:7535)   ERROR / AndroidRuntime(18083):在android.view.View.setBackgroundColor(View.java:7429)   ERROR / AndroidRuntime(18083):at com.taprik.Remote.RemoteMain $ 4.acceptMessage(RemoteMain.java:202)   ERROR / AndroidRuntime(18083):at com.illposed.osc.utility.OSCPacketDispatcher.dispatchMessage(Unknown Source)   ERROR / AndroidRuntime(18083):at com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(Unknown Source)   ERROR / AndroidRuntime(18083):at com.illposed.osc.utility.OSCPacketDispatcher.dispatchBundle(Unknown Source)   ERROR / AndroidRuntime(18083):at com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(Unknown Source)   ERROR / AndroidRuntime(18083):at com.illposed.osc.OSCPortIn.run(Unknown Source)   ERROR / AndroidRuntime(18083):at java.lang.Thread.run(Thread.java:1096)   WARN / ActivityManager(6722):强制完成活动com.taprik.Remote / .RemoteMain

1 个答案:

答案 0 :(得分: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);
        }
    }
}