Android-通过来自服务器的 json 响应使用 asynctask 填充微调器(NullPointerException:尝试调用虚拟方法..)
Android-Populate a spinner using asynctask by json response from the server (NullPointerException: Attempt to invoke virtual method ..)
我正在尝试使用异步任务从 JSON 响应填充 Spinner。我收到 JSON 对象作为服务器响应并且响应是正确的。这里是。
[{"category_id":1,"category_name":"History"},{"category_id":2,"category_name":"Sports"},{"category_id":3,"category_name":"Science"},{"category_id":4,"category_name":"gg"}]
我正在 View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstranceState)
上调用异步任务
但是我在 HomeFragment activity 启动时收到 'null object reference error'。
这是我的SpinnerAdapter.class。
package com.example.quizapp;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.example.quizapp.model.Category;
import java.util.List;
public class SpinnerAdapter extends BaseAdapter
{
private LayoutInflater layoutInflater;
private List<Category> categoryList;
private Context context;
public SpinnerAdapter(Context context, List<Category> list){
this.context = context;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.categoryList = list;
}
@Override
public int getCount() {
return categoryList.size();
}
@Override
public Object getItem(int position) {
return (Category)categoryList.get(position);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder spinnerHolder;
if(convertView == null){
spinnerHolder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.category_spinner_text_layout, parent,false);
spinnerHolder.spinnerItemList = (TextView) convertView.findViewById(R.id.catsSpinnerText);
convertView.setTag(spinnerHolder);
}else {
spinnerHolder = (ViewHolder) convertView.getTag();
}
spinnerHolder.spinnerItemList.setText(categoryList.get(position).getCatName());
return convertView;
}
class ViewHolder{
TextView spinnerItemList;
}
}
这是 HomeFragment.class 中用于填充 Spinner 的 AsyncTask。
public class CategoryLoadAsyncTask extends AsyncTask<Void, String, Category[]> {
@Override
protected void onPreExecute(){
progressDialog = ProgressDialog.show(getActivity(), "Loading Game", "Please wait..");
}
@Override
protected Category[] doInBackground(Void... params) {
String json ="";
Category[] categories = null;
try {
json = new RestClient().doGet(getString(R.string.category_url));
categories = new Gson().fromJson(json, Category[].class);
} catch (Exception e) {
e.printStackTrace();
}
return categories;
}
@Override
protected void onPostExecute(Category[] categories){
progressDialog.dismiss();
if (categories != null){
SpinnerAdapter spinnerAdapter = new SpinnerAdapter(context, Arrays.asList(categories));
catsSpinner.setAdapter(spinnerAdapter);
}
}
}
这是错误日志。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.quizapp, PID: 2381
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
at com.example.quizapp.HomeFragment$CategoryLoadAsyncTask.onPostExecute(HomeFragment.java:90)
at com.example.quizapp.HomeFragment$CategoryLoadAsyncTask.onPostExecute(HomeFragment.java:64)
at android.os.AsyncTask.finish(AsyncTask.java:660)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
谁能帮我解决这个问题?
替换这个
SpinnerAdapter spinnerAdapter = new SpinnerAdapter(context, Arrays.asList(categories));
有了这个
SpinnerAdapter spinnerAdapter = new SpinnerAdapter(GetActivity(), Arrays.asList(categories));
您似乎忘记了初始化 catsSpinner 变量。你能从你的 HomeFragment 分享相关部分吗?或者你能检查你的代码吗?如您所知,在片段中查找视图的最佳方法是 onViewCreated 回调。更新问题时请告诉我。
我正在尝试使用异步任务从 JSON 响应填充 Spinner。我收到 JSON 对象作为服务器响应并且响应是正确的。这里是。
[{"category_id":1,"category_name":"History"},{"category_id":2,"category_name":"Sports"},{"category_id":3,"category_name":"Science"},{"category_id":4,"category_name":"gg"}]
我正在 View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstranceState)
但是我在 HomeFragment activity 启动时收到 'null object reference error'。
这是我的SpinnerAdapter.class。
package com.example.quizapp;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.example.quizapp.model.Category;
import java.util.List;
public class SpinnerAdapter extends BaseAdapter
{
private LayoutInflater layoutInflater;
private List<Category> categoryList;
private Context context;
public SpinnerAdapter(Context context, List<Category> list){
this.context = context;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.categoryList = list;
}
@Override
public int getCount() {
return categoryList.size();
}
@Override
public Object getItem(int position) {
return (Category)categoryList.get(position);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder spinnerHolder;
if(convertView == null){
spinnerHolder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.category_spinner_text_layout, parent,false);
spinnerHolder.spinnerItemList = (TextView) convertView.findViewById(R.id.catsSpinnerText);
convertView.setTag(spinnerHolder);
}else {
spinnerHolder = (ViewHolder) convertView.getTag();
}
spinnerHolder.spinnerItemList.setText(categoryList.get(position).getCatName());
return convertView;
}
class ViewHolder{
TextView spinnerItemList;
}
}
这是 HomeFragment.class 中用于填充 Spinner 的 AsyncTask。
public class CategoryLoadAsyncTask extends AsyncTask<Void, String, Category[]> {
@Override
protected void onPreExecute(){
progressDialog = ProgressDialog.show(getActivity(), "Loading Game", "Please wait..");
}
@Override
protected Category[] doInBackground(Void... params) {
String json ="";
Category[] categories = null;
try {
json = new RestClient().doGet(getString(R.string.category_url));
categories = new Gson().fromJson(json, Category[].class);
} catch (Exception e) {
e.printStackTrace();
}
return categories;
}
@Override
protected void onPostExecute(Category[] categories){
progressDialog.dismiss();
if (categories != null){
SpinnerAdapter spinnerAdapter = new SpinnerAdapter(context, Arrays.asList(categories));
catsSpinner.setAdapter(spinnerAdapter);
}
}
}
这是错误日志。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.quizapp, PID: 2381
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
at com.example.quizapp.HomeFragment$CategoryLoadAsyncTask.onPostExecute(HomeFragment.java:90)
at com.example.quizapp.HomeFragment$CategoryLoadAsyncTask.onPostExecute(HomeFragment.java:64)
at android.os.AsyncTask.finish(AsyncTask.java:660)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
谁能帮我解决这个问题?
替换这个
SpinnerAdapter spinnerAdapter = new SpinnerAdapter(context, Arrays.asList(categories));
有了这个
SpinnerAdapter spinnerAdapter = new SpinnerAdapter(GetActivity(), Arrays.asList(categories));
您似乎忘记了初始化 catsSpinner 变量。你能从你的 HomeFragment 分享相关部分吗?或者你能检查你的代码吗?如您所知,在片段中查找视图的最佳方法是 onViewCreated 回调。更新问题时请告诉我。