我正在构建一个可以发送和接收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);
它按预期工作。
我的听众是
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
答案 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);
}
}
}