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 回调。更新问题时请告诉我。