我在onCreate函数中创建了一个活动和一个处理程序,如下所示:
private Handler mHandler;
private Button helloBtn;
private TextView helloText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(...);
helloBtn = (Button)findViewById(R.id.hello);
helloBtn.setOnClickListener(this);
helloText = (TextView)findViewById(R.id.text);
mHandler = new Handler()
{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MSG_REPORT_PROGRESS:
int progress = msg.arg1;
seekBar.setProgress(progress);
break;
case MSG_HELLO:
helloText.setText("hello world");
break;
}
}
};
}
public void onClick(View view) {
if(view == helloBtn)
{
Handler mainHanlder = new Handler(Looper.getMainLooper());
Message msg = new Message();
msg.what = MSG_HELLO;
mainHandler.sendMessage(msg);
}
}
单击helloBtn时,mainHandler没有收到消息。为什么?如果我直接使用mHandler替换mainHandler,它可以工作吗?
答案 0 :(得分:1)
使用以下代码..并让我知道反馈。要显示文本,不需要处理程序。
/** The m handler. */
private Handler mHandler;
/** The hello btn. */
private Button helloBtn;
/** The hello text. */
private TextView helloText;
/** The msg hello. */
private final int MSG_HELLO = 2;
/*
* (non-Javadoc)
*
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
helloBtn = (Button) findViewById(R.id.btn_hello);
helloBtn.setOnClickListener(this);
helloText = (TextView) findViewById(R.id.txt_hello);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_HELLO:
helloText.setText("hello world");
break;
}
}
};
}
/*
* (non-Javadoc)
*
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
public void onClick(View view) {
if (view.getId() == R.id.btn_hello) {
Message msg = new Message();
msg.what = MSG_HELLO;
mHandler.sendMessage(msg);
}
}
答案 1 :(得分:0)
Message类有一个字段“target”,用于存储用于发送消息的处理程序。当您调用Handler的sendMessage(msg)方法时,处理程序的引用将存储在消息中。当Looper发送您的消息时,它将调用msg.target.dispatchMessage(msg),这意味着您的msg将被分派到您用来发送它的同一个处理程序。方法dispatchMessage(msg)最终会调用handleMessage(msg)。
您可以使用BroadcastReceiver来解决您的问题。在您将来要更新的活动中注册BroadcastReceiver,并从您应用的其他部分向其发送广播。