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: 警告/dalvikvm(18083): threadid=7: キャッチされない例外で終了するスレッド (group=0x4001d7d0) エラー/AndroidRuntime(18083): 致命的な例外: スレッド 8 エラー/AndroidRuntime(18083): android.view.ViewRoot$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。ERROR/AndroidRuntime(18083): android.view.ViewRoot.checkThread(ViewRoot.java:2811) で ERROR/AndroidRuntime(18083): android.view.ViewRoot.requestLayout(ViewRoot.java:594) で ERROR/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 に答える