来自Looper.getMainLooper的处理程序没有收到消息

时间:2014-12-01 09:42:22

标签: android

我在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,它可以工作吗?

2 个答案:

答案 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,并从您应用的其他部分向其发送广播。