0

retrofit2を使用しているAPIからデータをダウンロード中にNullPointerExceptionが発生しました。私はDataServiceクラスのインナーコールバックを退去しました。私はそれをフラグメントListFragmentで呼び出してデータをダウンロードします。 ListFragmentにはRecyclerViewが実装され、そのデータが表示されます。今のところ、2つのtextViewだけを表示したいと思います。レイアウトはsingle_data_layoutです。 List<Feature> featuresは私のDataResponseです。私が間違っているのは誰ですか?retrofit2でデータをダウンロード中にNullPointerExceptionが発生する

あなたはretrofits equeue()の既存のコールバックを知っているかもしれませんか? オンラインは多くありません。

03-08 09:32:46.913 17938-17938/com.example.lwach.earthquakeapp E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.lwach.earthquakeapp, PID: 17938 
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.lwach.earthquakeapp.apiClient.DataService.getData(retrofit2.Callback)' on a null object reference 
    at com.example.lwach.earthquakeapp.ListFragment.onCreateView(ListFragment.java:33) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2189) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757) 
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355) 
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146) 
    at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098) 
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1979) 
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642) 
    at android.view.View.measure(View.java:18596) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
    at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:714) 
    at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90) 
    at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1375) 
    at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:784) 
    at android.view.View.measure(View.java:18596) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
    at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 
    at android.view.View.measure(View.java:18596) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:721) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:612) 
    at android.view.View.measure(View.java:18596) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
    at android.view.View.measure(View.java:18596) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:721) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:612) 
    at android.view.View.measure(View.java:18596) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2897) 
    at android.view.View.measure(View.java:18596) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2248) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1306) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1548) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:590) 
    at android.view.Choreographer.doFrame(Choreographer.java:560) 

ApiClient:

public interface ApiClient { 

    @GET("query") 
    Call<DataResponse> getData(@QueryMap Map<String, String> options); 
} 

ApiClientFactory:

public class ApiClientFactory { 

    public static final String baseURL = "https://earthquake.usgs.gov/fdsnws/event/1/"; 

    public ApiClient createApiClient(){ 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(baseURL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     return retrofit.create(ApiClient.class); 
    } 
} 

DataServic

あなたはGitHub

スタックトレースにプロジェクト全体を見つけることができますE:

public class DataService { 

    private static final String TAG = MainActivity.class.getSimpleName(); 

    private final ApiClient apiClient; 
    private List<Feature> features; 
    private Map<String, String> map; 

    public DataService() { 
     apiClient = new ApiClientFactory().createApiClient(); 
    } 

    Callback<DataResponse> responseCallback = new Callback<DataResponse>() { 
     @Override 
     public void onResponse(Call<DataResponse> call, Response<DataResponse> response) { 
      if (response.isSuccessful()) { 
       features = response.body().getFeatures(); 
      } 
      Log.d(TAG, "Data successfully downloaded"); 
     } 

     @Override 
     public void onFailure(Call<DataResponse> call, Throwable t) { 
      Log.e(TAG, t.toString()); 
     } 
    }; 

    public void getData(Callback<DataResponse> callback) { 

     map = new HashMap<>(); 
     map.put("format", "geojson"); 
     map.put("minsig", "700"); 

     apiClient.getData(map).enqueue(callback); 
    } 
} 

のDataAdapter:

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.DataViewHolder> { 

    private final List<Feature> features; 
    private LayoutInflater layoutInflater; 
    private ListFragment listFragment; 

    public DataAdapter(List<Feature> features, ListFragment listFragment) { 
     this.features = features; 
     this.listFragment = listFragment; 
    } 

    @Override 
    public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = layoutInflater.inflate(R.layout.single_data_layout, parent, false); 
     return new DataViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(DataViewHolder holder, int position) { 

     holder.place.setText(features.get(position).getProperties().getPlace()); 
     holder.alert.setText(features.get(position).getProperties().getAlert()); 
    } 

    @Override 
    public int getItemCount() { 
     return features.size(); 
    } 

    public static class DataViewHolder extends RecyclerView.ViewHolder { 

     private final TextView place; 
     private final TextView alert; 

     public DataViewHolder(View view) { 
      super(view); 
      place = (TextView) view.findViewById(R.id.place_text_view); 
      alert = (TextView) view.findViewById(R.id.alert_text_view); 
     } 
    } 
} 

ListFragment:

public class ListFragment extends Fragment { 

    private List<Feature> features; 
    private RecyclerView recyclerView; 
    private DataAdapter dataAdapter; 
    private DataService dataService; 
    private Callback<DataResponse> callback; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_list, container, false); 

     dataService.getData(callback); 
     recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
     dataAdapter = new DataAdapter(features, this); 
     recyclerView.setAdapter(dataAdapter); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 

     return view; 
    } 
} 
+1

を呼び出しますかそれを初期化するdataService = new DataService();私は完全に忘れてしまった – Raghavendra

答えて

0

あなたが初期化されていないDataServiceapiClient変数は、コンストラクタで初期化されている 。したがって、直接呼び出しはそのコンストラクタを呼び出さないでしょう。

これを使用してください。

dataService = new DataService(); 
dataService.getData(callback); 

あなたのListFragmentのonCreateViewです。

apiClient変数がdataService.getData(callback);好き直接呼び出し、そのコンストラクタを呼び出すことはありませんときにそう

apiClient.getData(map).enqueue(callback); 

NullPointerExceptionが生成されます

public DataService() { 
     apiClient = new ApiClientFactory().createApiClient(); 
    } 

に初期化されます。 apiClient変数はnullです。

+0

を試してみてください。助けてくれてありがとう。 –

+0

ここに喜んで。:) –

+0

時には最も簡単なことが最も難しいです:) –

0

ListFragmentでDataServiceを初期化していません。

そのオブジェクトを使用する前に初期化してください。

dataService = new DataService(); 

、あなたがたDataServiceのDataServiceを初期化していないListFragmentでこれを確認してください?

dataService.getData(callback); 
関連する問題