使用retrofit2从API下载数据时出现NullPointerException。我在DataService
类中解除了内部回调,我在片段ListFragment
中调用它来下载数据。 ListFragment
已实施RecyclerView
并将显示该数据。现在,我想只显示两个textViews。它们的布局名称为single_data_layout
。 List<Feature> features
是DataResponse
。任何想法,我做错了什么?
也许你知道改造equeue()的现有回调的一些例子? 在线人数不多。
您可以在GitHub
上找到整个项目堆栈跟踪:
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);
}
}
的DataService:
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;
}
}
答案 0 :(得分:0)
您尚未初始化DataService
其中apiClient
变量在其构造函数中初始化。所以直接调用不会调用它的构造函数。
使用此功能。
dataService = new DataService();
dataService.getData(callback);
在ListFragment的onCreateView中。
apiClient
变量在
public DataService() {
apiClient = new ApiClientFactory().createApiClient();
}
因此,当您直接调用dataService.getData(callback);
时,不会调用其构造函数
apiClient.getData(map).enqueue(callback);
将产生 nullpointerexception。因为apiClient
变量为空。
答案 1 :(得分:0)
您尚未在ListFragment中初始化DataService。
在使用该对象之前对其进行初始化。
dataService = new DataService();
并致电
dataService.getData(callback);