2013-05-04 11 views
9

का उपयोग कर मैं अपने कस्टम उद्देश्य के साथ LocalBroadcastManager उपयोग करने के लिए कोशिश कर रहा हूँ। ऐसा लगता है कि यह उद्देश्य बारे में बहुत picky है और अगर मैं इस तरह से आशय भेजें: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 का उपयोग आईसीआईटी स्ट्रिंग

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

सब कुछ ठीक काम करता है।

क्या गलत है? मैं किसी अन्य वर्ग में इरादा नाम क्यों परिभाषित नहीं कर सकता?

+1

सार्वजनिक स्थिर अंतिम स्ट्रिंग "LOCATION_UPDATE = (उद्धरण LOCATION_UPDATE से पहले), यह है कि एक टाइपो? – Sudhee

+0

की सामग्री क्या है" LocalBroadcastManager.java:297 " – k3b

+0

कोई यह नहीं है कि लिखने में गलती .. LocalBroadcastManager एंड्रॉयड ढांचे का हिस्सा है। मेरा नहीं – ApriOri

उत्तर

17

मैं बस इस पर आया था। एनपीई आपके द्वारा फायरिंग (MyIntents.LOCATION_UPDATE) के लिए पंजीकृत श्रोता (पढ़ना: रिसीवर) का परिणाम है जो इसे होस्ट करने वाले घटक द्वारा तत्काल नहीं किया गया है।

जांचें कि आप इस प्रसारण को जिस चीज का जवाब देना चाहते हैं उसे वास्तव में सही बिंदु (शायद होस्टिंग गतिविधि/खंड) पर तुरंत चालू किया गया है।

+0

तो कैसे आप स्पष्ट स्ट्रिंग मुद्दे की व्याख्या मैं समझ में नहीं आया कि क्यों एक स्थिर अंतिम स्ट्रिंग चर के लिए इनलाइन स्ट्रिंग को बदलने के लिए किसी भी फर्क नहीं पड़ता । – 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 में देख सकते हैं # 2 9 7) – OceanLife

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(); 

मुझे आशा है कि यह इस त्रुटि का सामना करना पड़ अन्य लोगों को मदद मिलती है।

+0

मैंने रिसीवर ऑन क्रेट (एक टुकड़े टुकड़े) में बनाया और रिसीवर को अटैच में पंजीकृत किया। यह त्रुटि मिली, इसलिए बस सुनिश्चित करें कि आप एक ही स्थान पर प्राप्तकर्ता बनाते हैं। – Gober

संबंधित मुद्दे