2013-05-04 16 views
9

사용자 지정 인 텐트와 함께 LocalBroadcastManager를 사용하려고합니다. 의도에 대해 매우 까다 롭고 있다는 것 그리고 내가 의도 이런 식으로 보낼 경우 : Myintents.java에서LocalBroadcastManager를 사용할 때 NullPointerException이 발생했습니다.

을 나는 방송 송신자에 나중에

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

방금이 문제가 발생했습니다. NPE는 사용자가 실행중인 이벤트 (MyIntents.LOCATION_UPDATE)에 대해 등록 된 리스너 (읽기 : 수신자)가 호스팅하는 구성 요소에 의해 인스턴스화되지 않은 결과입니다.

이 브로드 캐스트에 응답하려는 것이 실제로 올바른 지점 (아마도 호스팅 활동/조각)에서 인스턴스화되었는지 확인하십시오.

+0

명시 적 문자열 문제를 설명하는 방법은 무엇입니까? 정적 최종 문자열 변수를 인라인 문자열로 변경하면 어떤 차이가 발생하는지 이해하지 못했습니다. – ApriOri

+0

나는 그 의도가 [행동] (http://developer.android.com/reference/android/content/Intent.html#Intent (java.lang.String))이 뭔가 바뀌 었다고 생각한다. 그것은 다른 수신기가 intent 필터 (즉, 해당 액션이 브로드 캐스팅 될 때 호출 됨)에 등록 된 임의로 ("com.example.myapp.location_update"보다는 "my-intent") 임의적으로 사용합니다. LocalBroadcastManager는 "my-intent"액션을 수신하도록 등록 된 리스너가 없으므로 아무 일도 일어나지 않았습니다. – 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을 (호출하려고 할 때까지

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

이 문제가 아니었다 :

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에이 클래스의 빈 참조를 전달 (그리고 onReceive() 메소드를 오버라이드) 수업의 내가 잊어 버린 것은 :

m_MeasurementUpdateReceiver = new MeasurementUpdateReceiver(); 

다른 사람들이이 오류에 직면 할 수 있기를 바랍니다.

+0

onCreate (of Fragment)에서 수신기를 만들고 onAttach에 수신기를 등록했습니다. 이 오류가 발생 했으므로 동일한 장소에 수신자를 생성했는지 확인하십시오. – Gober

관련 문제