我有一个带有Android.os.Handler的Activity,用于与openGL线程进行通信。 我想从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为空。
答案 0 :(得分:1)
我现在得到的是几乎所有时间都在makeDialog方法中msg为空。
我相信当这种情况发生时,消息已被回收。让我们创建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);
}