10

我正在尝试将 LocalBroadcastManager 与我的自定义意图一起使用。似乎对意图非常挑剔,如果我以这种方式发送意图:

在 Myintents.java 我声明

public static final String LOCATION_UPDATE = "com.example.myapp.location_update";

稍后在广播发送者中我会:

Intent intent = new Intent(MyIntents.LOCATION_UPDATE);
localBroadcastManager.sendBroadcast(intent);

然后我得到了这个例外:

05-05 02:23:29.914: E/AndroidRuntime(6952): FATAL EXCEPTION: main 
05-05 02:23:29.914: E/AndroidRuntime(6952): java.lang.NullPointerException 
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297) 
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)  
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116) 
05-05 02:23:29.914: E/AndroidRuntime(6952): at android.os.Handler.dispatchMessage(Handler.java:99)

但是,如果我使用显式字符串

Intent intent = new Intent("my-intent");

一切正常。

怎么了?为什么我不能在另一个类中定义意图名称?

4

2 回答 2

17

我刚遇到这个。NPE 是您正在触发的事件 (MyIntents.LOCATION_UPDATE) 的注册侦听器(读取:接收器)尚未由托管它的组件实例化的结果。

检查您要响应此广播的内容是否已在正确的点(可能是托管活动/片段)实际实例化。

于 2013-05-22T20:08:37.487 回答
12

就我而言,(我有同样的错误)我忘记创建一个扩展广播接收器的类的实例。(并覆盖 onReceive() 方法)

    private MeasurementUpdateReceiver   m_MeasurementUpdateReceiver;

// Listens to local broadcasts done by the MeasurementService
private class MeasurementUpdateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Intent already filtered by the LocalBroadcastManager in onResume()
        String data = intent.getStringExtra("data"));
        Toast.makeText(getApplicationContext(), "Received data " + data, Toast.LENGTH_LONG).show();
    }
}

将此类的空引用传递给 LocalBroadcastManager:

LocalBroadcastManager.getInstance(this).registerReceiver(m_MeasurementUpdateReceiver, new IntentFilter("measurementupdate"));

在尝试调用类的 onReceive() 方法之前,这不是问题。我忘记的是:

m_MeasurementUpdateReceiver = new MeasurementUpdateReceiver();

我希望这可以帮助其他面临此错误的人。

于 2013-06-20T10:48:03.120 回答