2013-05-04 42 views
9

Tôi đang cố gắng sử dụng LocalBroadcastManager với các ý định tùy chỉnh của mình. Dường như nó rất kén chọn về ý nghĩa và Nếu tôi gửi ý định theo cách này:NullPointerException khi sử dụng LocalBroadcastManager

Trong Myintents.java Tôi tuyên bố

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

Sau đó trong người gửi broadcast tôi làm:

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

Sau đó, tôi nhận được ngoại lệ này:

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) 

Tuy nhiên, nếu tôi sử dụng giải thích icit string

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

Mọi thứ đều hoạt động tốt.

Có vấn đề gì? Tại sao tôi không thể xác định tên ý định trong một lớp khác?

+1

Chuỗi cuối cùng tĩnh công khai "LOCATION_UPDATE = (Trích dẫn trước LOCATION_UPDATE), nó có lỗi đánh máy? – Sudhee

+0

nội dung của" LocalBroadcastManager.java:297 " – k3b

+0

Không phải là lỗi đó. LocalBroadcastManager là một phần của khung công tác Android. – ApriOri

Trả lời

17

Tôi vừa mới thấy điều này. NPE là kết quả của trình lắng nghe đã đăng ký (đọc: bộ thu) cho sự kiện bạn đang kích hoạt (MyIntents.LOCATION_UPDATE) không được khởi tạo bởi thành phần lưu trữ nó.

Kiểm tra xem nội dung bạn muốn trả lời cho chương trình phát sóng này có thực sự được khởi tạo ở đúng điểm hay không (có thể là hoạt động/phân đoạn lưu trữ).

+0

Vậy làm thế nào để bạn giải thích vấn đề chuỗi rõ ràng? Tôi không hiểu tại sao thay đổi chuỗi nội tuyến thành biến chuỗi cuối cùng tạo nên sự khác biệt – ApriOri

+0

Tôi nghi ngờ đó là do thực tế là ý định [hành động] (http://developer.android.com/reference/android/content/Intent.html#Intent (java.lang.String)) đã được thay đổi từ một cái gì đó mà người nhận khác đã đăng ký trong bộ lọc ý định của nó (tức là được gọi khi hành động đó được phát sóng) mething tùy ý ("my-intent" chứ không phải là "com.example.myapp.location_update"). LocalBroadcastManager không tìm thấy người nghe nào đã đăng ký nhận hành động "ý định của tôi" nên không có gì xảy ra. – OceanLife

+0

Bạn có thể thấy điều này trong AOSP [tại đây] (https://code.google.com/p/moloko/source/browse/libs/ActionBarSherlock/src/android/support/v4/content/LocalBroadcastManager.java?r=538 # 297) – OceanLife

12

Trong trường hợp của tôi, (tôi đã có lỗi tương tự) Tôi quên tạo một thể hiện của lớp của tôi mở rộng BroadcastReceiver. (Và override phương thức 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(); 
    } 
} 

Đi qua một tham chiếu rỗng của lớp này đến LocalBroadcastManager với:

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

không phải là một vấn đề cho đến khi nó cố gắng để gọi onReceive (phương pháp) của lớp. Những gì tôi đã quên là:

m_MeasurementUpdateReceiver = new MeasurementUpdateReceiver(); 

Tôi hy vọng điều này sẽ giúp những người khác đối mặt với lỗi này.

+0

Tôi đã tạo bộ thu trong onCreate (của một Fragment) và đăng ký bộ nhận trong onAttach. Có lỗi này, do đó, chỉ cần đảm bảo bạn tạo máy thu tại cùng một nơi. – Gober

Các vấn đề liên quan