1

openGL スレッドとの通信に使用される Android.os.Handler のアクティビティがあります。opengl スレッドからメッセージを取得し、メッセージ データに応じてアクティビティで GUI を描画したいので、次のようにします。

Handler handle = new Handler(new Handler.Callback(){
        public boolean handleMessage(Message msg){
            // update  GUI like
            TextView v1 = (TextView) GamescreenActivity .this.findViewById(R.id.mytextview)
            // then what I actually would like to do but it does not work:
            Button b = (Button) GamescreenActivity.this.findViewById(R.id.mybutton);
            b.setOnClickListener(null);
            if (msg.what == MY_OWN_CONSTANT) { 
                b.setOnClickListener(getOnClickDoSomething(msg));
            }
        }
View.OnClickListener getOnClickDoSomething(final Message msg)  {
    return new View.OnClickListener() {
        public void onClick(View v) {
            makeDialog(msg);
        }
    };
}
private void makeDialog(Message msg) {      
    AlertDialog.Builder builder = new AlertDialog.Builder(GamescreenActivity.this);
    builder.setMessage("yo")
    .setTitle(""+ msg.what);
    AlertDialog dialog = builder.create();
    dialog.show();
}

私が達成しようとしていることは明らかです。私が今得ているのは、ほぼ常にmakeDialogメソッドでmsgがnullであることです。

4

1 に答える 1

1

私が今までに得たのは、ほとんどの場合、makeDialogメソッドでmsgがnullであるということです。

これが起こったとき、私はメッセージがすでにリサイクルされていると信じています。コードのローカルコピーを作成し、msgコードを少し変更して、より効率的にしましょう。まず、新しいフィールド変数を作成します。

Message message;

次に、if-elseブロックを変更します。

if (msg.what == MY_OWN_CONSTANT) { 
    message = Message.obtain(msg);
    b.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(GamescreenActivity.this);
            builder.setMessage("yo")
                    .setTitle(""+ message.what)
                    .show();
            message.recycle(); // Recycle our message when we're done
        }
    });
}
else {
    b.setOnClickListener(null);
}
于 2012-12-23T20:43:27.330 に答える