出于某种原因,Android吐司不会在UI上显示

时间:2012-06-01 20:34:36

标签: java android broadcastreceiver

我的做法类似于此处讨论的内容: Android BroadcastReceiver within Activity

我有使用或不使用UI运行的应用程序。当屏幕关闭时,它只是在背景上工作。当UI打开并且可见时 - 我想让用户知道发生了什么。

所以,我在上面的主题中跟踪了样本,并在Activity上注册了广播接收器。我在onResume

注册onPause并取消注册
private BroadcastReceiver uiNeedToBeUpdatedReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            // TODO Auto-generated method stub
            Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG);
        }
    };

@Override
    protected void onPause()
    {
        Log.d(LOG_TAG, "onPause");
        super.onPause();

        // TODO: Unregister broadcast receiver
        unregisterReceiver(uiNeedToBeUpdatedReceiver);
    }

@Override
    protected void onResume()
    {
        Log.d(LOG_TAG, "onResume");
        super.onResume();

        // TODO: Register for broadcast events
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.my.uineedtobeupdated");
        registerReceiver(uiNeedToBeUpdatedReceiver, filter);

在我在后台运行的AsyncTask内执行此操作:

// Send broadcast - if UI active it will see it:
        Intent broadcast = new Intent();
        broadcast.setAction("com.my.uineedtobeupdated");
        MyApplication.Me.sendBroadcast(broadcast);

嗯,一切都有效。我收到广播,我在调试器中看到我正在尝试Toast应该显示的行。但我没有看到任何吐司出现。

这是线程问题吗?我虽然如果收到广播,它会在UI线程上?为什么我会观察到这种行为?

2 个答案:

答案 0 :(得分:11)

重要的是不仅要创建Toast,还要实际显示它。简单的方法:

Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG).show();

你当然也可以:

Toast myToast = Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG);
myToast.show();

答案 1 :(得分:2)

Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG);

您正在制作Toast,但您没有展示它。您需要在其上调用show,如下所示:

Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG).show();