【问题标题】:android ViewPager With Fragment Volley request on a null object reference errorandroid ViewPager With Fragment Volley request on a null object reference error
【发布时间】:2018-01-15 09:02:09
【问题描述】:

嗨,我有一个 viewPager,上面有一些列表,列表数据来自服务器,当我几次更改页面时,这个错误就出现了,这是我到目前为止的代码 这里错误

01-15 12:11:48.512 9508-9508/app.mma.introsliderproject E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: app.mma.introsliderproject, PID: 9508
                                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference
                                                                              at app.mma.PokerInfo.lastWorldNews.LastWorldNewsFragment$4.onResponse(LastWorldNewsFragment.java:122)
                                                                              at app.mma.PokerInfo.lastWorldNews.LastWorldNewsFragment$4.onResponse(LastWorldNewsFragment.java:117)

我的 viewPager setOffScreenLimit 是 4,而我的 Pager Pages 是 7 这是 LastWorldNews 片段

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_last_world_news,container,false);
    prepareData();
    mListView = (ListView) view.findViewById(R.id.list_world_news);
    pb = (ProgressBar) view.findViewById(R.id.progresslastnews);
    refresh = (SwipeRefreshLayout) view.findViewById(R.id.refresh_news);
    btn = (Button) view.findViewById(R.id.btn_retry_last_news);
    tv = (AppCompatTextView) view.findViewById(R.id.tv_last_news);
    ConnectivityInit(HIDE);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (CheckInternet.isOnline(getContext())){
                ((MainActivity)getActivity()).getUrl("lastWorldNews");
                ConnectivityInit(HIDE);
                pb.setVisibility(View.VISIBLE);
                prepareData();
            }
        }
    });
    refresh.setColorSchemeColors(
            R.color.material_green_200,
            R.color.material_green_400,
            R.color.material_green_600,
            R.color.material_green_800
    );
    refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            prepareData();
            refresh.setRefreshing(false);
        }
    });

private void prepareData() {
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            LastWolrdNewsParser parser = new LastWolrdNewsParser();
            ArrayList<LastWorldNews> news = parser.ParseJson(response);
            LastWorldNewsAdapter adapter = new LastWorldNewsAdapter(getActivity().getApplicationContext(),
                    R.layout.last_world_news_list_item,news);
            pb.setVisibility(View.GONE);
            if (mListView.getVisibility() == View.INVISIBLE || mListView.getVisibility()==View.GONE){
                mListView.setVisibility(View.VISIBLE);
            }
            mListView.setAdapter(adapter);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            pb.setVisibility(View.GONE);

        }
    });

    RequestQueue quew = Volley.newRequestQueue(getActivity().getApplicationContext());
    quew.add(request);
}

@Override
public void onPause() {
    super.onPause();
    if (request != null){
        request.cancel();
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (request != null){
        request.cancel();

    }
}

} 我想将 pageoffScreenLimit 更改为 6,但我想知道有没有更好的方法?而 onDestroy 和 onPause 方法是标准方式吗?

【问题讨论】:

    标签: android android-fragments android-volley


    【解决方案1】:

    尝试改变

    getActivity().getApplicationContext()
    

    getActivity()
    

    删除getApplicationContext()

    【讨论】:

      【解决方案2】:

      定义变量Context mContext;

      将此方法添加到片段

      @Override
          public void onAttach(Context context) {
              super.onAttach(context);
              mContext = context;
          }
      

      此方法将初始化附加到活动的 contaxt 片段。 使用mContext 代替getApplicationContext() 方法

      【讨论】:

      • @sadegh prepareData(); 方法在初始化 pb = (ProgressBar) view.findViewById(R.id.progresslastnews); 之前被调用。在 prepareData() 方法中使用。这可能会导致将来出错
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2013-02-11
      • 2013-01-04
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多