Java 使用2下载数据时出现NullPointerException
我在使用2从API下载数据时出现NullPointerException。我在Java 使用2下载数据时出现NullPointerException,java,android,android-studio,nullpointerexception,retrofit2,Java,Android,Android Studio,Nullpointerexception,Retrofit2,我在使用2从API下载数据时出现NullPointerException。我在DataService类中解救了内部回调,并在fragmentListFragment中调用它来下载数据ListFragment已实现RecyclerView,并将显示该数据。现在,我只想显示两个文本视图。它们的布局具有名称单个数据\u布局列表功能是我的数据响应。有人知道我做错了什么吗 也许您知道一些改装equeue()的现有回调示例? 网上的人不多 你可以在网上找到整个项目 堆栈跟踪: 03-08 09:32:46.
DataService
类中解救了内部回调,并在fragmentListFragment
中调用它来下载数据ListFragment
已实现RecyclerView
,并将显示该数据。现在,我只想显示两个文本视图。它们的布局具有名称单个数据\u布局
<代码>列表功能是我的数据响应
。有人知道我做错了什么吗
也许您知道一些改装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);
}
数据服务:
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);
}
}
公共类数据服务{
私有静态最终字符串标记=MainActivity.class.getSimpleName();
私人最终ApiClient ApiClient;
私有列表功能;
私人地图;
公共数据服务(){
apiClient=新建ApiClientFactory().createApiClient();
}
Callback responseCallback=新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
features=response.body().getFeatures();
}
Log.d(标记“数据成功下载”);
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(TAG,t.toString());
}
};
公共void getData(回调){
map=新的HashMap();
map.put(“格式”、“geojson”);
地图放置(“minsig”、“700”);
getData(map).enqueue(回调);
}
}
数据适配器:
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);
}
}
}
公共类DataAdapter扩展了RecyclerView.Adapter{
私人最终列表功能;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
私有ListFragment ListFragment;
公共数据适配器(列表功能,ListFragment ListFragment){
这个。特征=特征;
this.listFragment=listFragment;
}
@凌驾
public DataViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=布局更平坦。充气(R.layout.single\u data\u layout,parent,false);
返回新的DataViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(DataViewHolder,int位置){
holder.place.setText(features.get(position.getProperties().getPlace());
holder.alert.setText(features.get(position.getProperties().getAlert());
}
@凌驾
public int getItemCount(){
返回features.size();
}
公共静态类DataViewHolder扩展了RecyclerView.ViewHolder{
私人最终文本视图位置;
私人最终文本视图警报;
公共数据视图持有者(视图){
超级(视图);
place=(TextView)view.findViewById(R.id.place\u text\u view);
alert=(TextView)view.findViewById(R.id.alert\u text\u view);
}
}
}
列表片段:
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;
}
}
公共类ListFragment扩展了片段{
私有列表功能;
私人回收站;
专用数据适配器;
私有数据服务数据服务;
私有回调;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u列表,容器,false);
getData(回调);
recyclerView=(recyclerView)视图.findViewById(R.id.recycler\u视图);
dataAdapter=新的dataAdapter(特性,此项);
recyclerView.setAdapter(dataAdapter);
setLayoutManager(新的LinearLayoutManager(getContext());
返回视图;
}
}
您尚未初始化数据服务
其中,apiClient
变量在其构造函数中初始化。所以直接调用不会调用其构造函数
用这个
dataService = new DataService();
dataService.getData(callback);
在ListFragment的onCreateView中
apiClient
变量在中初始化
public DataService() {
apiClient = new ApiClientFactory().createApiClient();
}
所以当您直接调用时,比如dataService.getData(回调)代码>将不会调用其构造函数,因此
apiClient.getData(map).enqueue(callback);
将产生nullpointerexception。因为apiClient
变量为null您尚未在ListFragment中初始化DataService
在使用该对象之前初始化它
dataService = new DataService();
打电话
dataService.getData(callback);
在ListFragment中选中此项您尚未初始化DataService DataService?初始化它dataService=newdataservice();我完全忘记了。谢谢你的帮助。很高兴在这里……)有时最简单的事情是最难的:)
dataService.getData(callback);