6

Tôi có thực hiện giao diện riêng sau trong Fragment tôi:NullPointerException trong restartLoader Phương pháp LoaderManager

@Override 
    public void onReportChanged(Fragment sender, long id, int position) { 
     // Views ein und ausblenden 
     _List.setVisibility(View.GONE); 
     _OnLoading.setVisibility(View.VISIBLE); 
     _NoDataView.setVisibility(View.GONE); 
     _ReportId = id; 
     getLoaderManager().restartLoader(_LM_REPORTS, null, this); 
    }; 

Báo cáo FragmentActivity để Fragment này, rằng một Fragment (Lựa chọn trong danh sách) đã chọn một mục. Sau đó, ListFragment sẽ nạp dữ liệu mới với ID được báo cáo (_ReportId).

Nhưng tôi nhận được NullPoinerException trên mã này trước khi đi đến phương thức onCreateLoader-Method. Đây là LogCat:

05-28 14:24:37.905: E/AndroidRuntime(1775): FATAL EXCEPTION: main 
05-28 14:24:37.905: E/AndroidRuntime(1775): java.lang.NullPointerException 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.support.v4.app.LoaderManagerImpl.restartLoader(LoaderManager.java:637) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at de.webducer.android.worktime.beta.ui.fragment.ReportListFragment.onReportChanged(ReportListFra gment.java:142) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at de.webducer.android.worktime.beta.ui.ReportListActivity.onReportSelected(ReportListActivity.java:97) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at de.webducer.android.worktime.beta.ui.fragment.ReportSelectorSpinnerFragment$1.onItemSelected(ReportSelectorSpinnerFragment.java:78) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:882) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.widget.AdapterView.access$200(AdapterView.java:48) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:848) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.os.Handler.handleCallback(Handler.java:605) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.os.Looper.loop(Looper.java:137) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at dalvik.system.NativeStart.main(Native Method) 

Tôi không hiểu tại sao. Cùng một mã (nhưng đối với danh sách khác) hoạt động tốt trên FragmentActivity khác.

Trả lời

3

tôi thấy lý do:

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle extra) { 
    CursorLoader returnValue = null; 
    if (_ReportId > 0) { 
     switch (id) { 
      case _LM_REPORTS: 
       returnValue = new CursorLoader(getActivity(), 
        ReportContentProvider.CONTENT_URI_REPORT_DATA, 
        null, 
        ReportTable.COLUMN_ID + " =?", 
        new String[] { String.valueOf(_ReportId) }, 
        null); 
        break; 

       default: 
        break; 
      } 
     } 
    return returnValue; 
} 

Các Loader có allways để chạy. Điều kiện if (_ReportId > 1) đã tạo ra ngoại lệ. Nếu không có điều kiện mã chạy tốt.

+0

Tôi vẫn không hiểu giải thích ... Bạn có thể giải thích thêm một chút không ?? Những gì hiện: "Loader có allways để chạy"? – Entreco

+3

Tôi tin rằng ông có nghĩa là nếu _ReportId = -1, nó sẽ không tạo ra một bộ tải để giá trị của "returnValue = null". Sau đó loadermanager cố gắng để bắt đầu một bộ nạp null và ném con trỏ null. –

+0

id được báo cáo ở đây –

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