2013-05-04 2 views
9

Я пытаюсь использовать LocalBroadcastManager с моими собственными намерениями. кажется, что это очень требовательно намерениями и если я посылаю намерение так:NullPointerException при использовании 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) 

Однако если я использую EXPL icit строка

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

Все работает нормально.

Что случилось? Почему я не могу определить имя намерения в другом классе?

+1

общественности статической окончательный String «LOCATION_UPDATE = (цитата, прежде чем LOCATION_UPDATE), это то, что опечатка? – Sudhee

+0

что содержание„LocalBroadcastManager.java:297“ – k3b

+0

Нет, это не то, что опечатка .. LocalBroadcastManager является частью Android рамок. не мой. – ApriOri

ответ

17

Я только что наткнулся на это. NPE является результатом зарегистрированного слушателя (чтение: приемник) для события, которое вы запускаете (MyIntents.LOCATION_UPDATE), которое не было создано экземпляром, принимающим его.

Проверьте, что вещь, которую вы хотите отреагировать на эту трансляцию, фактически была создана в правой части (вероятно, хостинговая деятельность/фрагмент).

+0

Итак, как вы объясните явную проблему с строкой? Я не понял, почему изменение строки inline в статической конечной строковой переменной делает какую-либо разницу – ApriOri

+0

Я подозреваю, что это связано с тем, что намерение [действие] (http://developer.android.com/reference/android/content/Intent.html#Intent (java.lang.String)) было изменено от чего-то который другой приемник зарегистрировал в своем намеренном фильтре (т.е. вызывается, когда это действие транслируется) так метрирование произвольное («мое намерение», а не «com.example.myapp.location_update»). LocalBroadcastManager не обнаружил, что слушатели не зарегистрировались на полученные «мои намерения», поэтому ничего не произошло. – OceanLife

+0

Вы можете увидеть это в AOSP [здесь] (https://code.google.com/p/moloko/source/browse/libs/ActionBarSherlock/src/android/support/v4/content/LocalBroadcastManager.java?r=538 # 297) – OceanLife

12

В моем случае (у меня была такая же ошибка) Я забыл создать экземпляр моего класса, который расширяет BroadcastReceiver. (И переопределяет метод 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(); 

Я надеюсь, что это поможет другим людям, столкнувшимся с этой ошибкой. не

+0

Я создал ресивер в onCreate (из фрагмента) и зарегистрировал приемник в onAttach. Получил эту ошибку, поэтому просто убедитесь, что вы создали приемник в том же месте. – Gober

Смежные вопросы