首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么布局上的setBackgroundColor有时会使我的应用程序崩溃

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

Stack Overflow用户
提问于 2011-08-05 14:09:57
回答 1查看 2.3K关注 0票数 1

我正在构建一个可以发送和接收OSC的应用程序。我正在使用JavaOSC,它完美地满足了我的需求。

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

我发送的颜色从一个颜色选择器,基于这个颜色选择器http://code.google.com/p/color-picker-view/,它的工作很好。

我的问题是:

  • 当我在颜色选择器中选择颜色时,我用:

设置布局的背景(颜色选择器所在的地方)视图

私有ColorPickerView.OnColorChangedListener colorListener =新的ColorPickerView.OnColorChangedListener(){

代码语言:javascript
复制
    @Override
    public void onColorChanged(int color) {
        caller.sending("color", color);
        mScreen.setBackgroundColor(color);
    }
};

其中mScreen是LinearLyout

mScreen = (LinearLayout) findViewById(R.id.myScreen);

它如预期的那样工作。

  • 当我收到一条带有颜色的OSC消息时,我也想改变背景,但是它崩溃了。

我的听众是

OSCListener listener =新OSCListener() {

代码语言:javascript
复制
        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函数中),还是当它在屏幕上重绘某些东西时?

坠机报告

android.view.ViewRoot$CalledFromWrongThreadException::

08-05 15:18:15.035: WARN/dalvikvm(18083):threadid=7:线程退出带有未登录异常(group=0x4001d7d0)错误/AndroidRuntime(18083):致命异常:线程-8错误/AndroidRuntime(18083):只有创建视图层次结构的原始线程才能触摸其视图。ERROR/AndroidRuntime(18083):at android.view.ViewRoot.checkThread(ViewRoot.java:2811) ERROR/AndroidRuntime(18083):at android.view.ViewRoot.requestLayout(ViewRoot.java:594) ERROR/AndroidRuntime(18083):at android.view.View.requestLayout(View.java:8180) ERROR/AndroidRuntime(18083):at android.view.View.requestLayout(View.java:8180) ERROR/AndroidRuntime(18083):at android.view.View.requestLayout(查看)。java:8180) ERROR/AndroidRuntime(18083):at android.view.View.setBackgroundDrawable(View.java:7535) ERROR/AndroidRuntime(18083):at 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源)错误/Unknown运行时(18083):在com.illposed.osc.utility.OSCPacketDispatcher.dispatchBundle(Unknown源)错误/Unknown运行时(18083):在com.illposed.osc.utility.OSCPacketDispatcher.dispatchPacket(Unknown源)错误/Unknown运行时(18083):在com.illposed.osc.OSCPortIn.run(未知源)错误/Unknown运行时(18083):at java.lang.Thread.run(Thread.java:1096)警告/ActivityManager(6722)):力整理活动com.taprik.Remote/.RemoteMain

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-05 14:12:40

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

您只能更改UI线程上的UI元素:注释:在UI线程上执行的任何操作都将阻止其他UI操作。因此,如果您正在通过UI线程上的某个长列表,则用户不能在它发生时与UI进行交互。

代码语言:javascript
复制
MyActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        mScreen.setBackgroundColor(color);
    }
});

或者:

代码语言:javascript
复制
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);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6957651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档