在片段/ viewpager之间滑动时发生齐射错误

时间:2017-12-05 06:41:06

标签: java android android-fragments android-volley

在我的活动中,所有标签都是动态创建的。每个刷json数据都被调用。在多次滑动之后发生凌空错误。在此之后,片段和任何其他页面上没有可用的数据。这是我的代码

fragmentParent.addPage(jsonObject.getString("name"),jsonObject.getString("cat_id"),shop_id);




    public class FragmentParent extends Fragment {
        private TabLayout tabLayout;
        private ViewPager viewPager;
        private ViewPagerAdapter1 adapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_parent, container, false);
        getIDs(view);
        setEvents();
        return view;
    }

    private void getIDs(View view) {
        viewPager = (ViewPager) view.findViewById(R.id.my_viewpager);
        tabLayout = (TabLayout) view.findViewById(R.id.my_tab_layout);
        adapter = new ViewPagerAdapter1(getFragmentManager(), getActivity(), viewPager, tabLayout);
        viewPager.setAdapter(adapter);
    }

    int selectedTabPosition;

    private void setEvents() {

        tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                super.onTabSelected(tab);
                viewPager.setCurrentItem(tab.getPosition());
                selectedTabPosition = viewPager.getCurrentItem();
                Log.d("Selected", "Selected " + tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                super.onTabUnselected(tab);
                Log.d("Unselected", "Unselected " + tab.getPosition());
            }
        });
    }

    public void addPage(String pagename, String id,String shop_id) {
        Bundle bundle = new Bundle();
        bundle.putString("data", id);
        bundle.putString("shop_id", shop_id);
        FragmentChild fragmentChild = new FragmentChild();
        fragmentChild.setArguments(bundle);
        adapter.addFrag(fragmentChild, pagename);
        adapter.notifyDataSetChanged();
        if (adapter.getCount() > 0) tabLayout.setupWithViewPager(viewPager);

        viewPager.setCurrentItem(adapter.getCount() - 1);
        setupTabLayout();
    }

    public void setupTabLayout() {
        selectedTabPosition = viewPager.getCurrentItem();
        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            tabLayout.getTabAt(i).setCustomView(adapter.getTabView(i));
        }
    }
}





public class FragmentChild extends Fragment {
    String childname,shoppe_id;
    RecyclerView imgflag;
    CategoryItemAdapter categoryItemAdapter;
    HttpStack stack;
    List<ShopDetails> cat_item_list;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_child, container, false);
        Bundle bundle = getArguments();
        childname = bundle.getString("data");
        shoppe_id=bundle.getString("shop_id");
        stack = new HurlStack();
        imgflag=(RecyclerView)view.findViewById(R.id.imgflag);
        cat_item_list = new ArrayList<ShopDetails>();
        categoryItemAdapter = new CategoryItemAdapter(getActivity(),cat_item_list);
        GridLayoutManager layoutManager
                = new GridLayoutManager(getActivity(),1, GridLayoutManager.VERTICAL,false);
        imgflag.setLayoutManager(layoutManager);
        imgflag.setAdapter(categoryItemAdapter);
       getCategoryItem(childname);       
        return view;
    }


    public void getCategoryItem(String cat_id)
    {

        stack = new HurlStack(null, createSslSocketFactory());
        final RequestQueue requestQueue = Volley.newRequestQueue(getActivity(),stack);
        String url=config.api_url+"view_cat_item.php?cat_id="+cat_id;
        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                if(response.equals("0 results"))
                {

                }
                else
                {

                    try {
                        JSONArray jsonArray=new JSONArray(response);
                        for(int i=0;i<jsonArray.length();i++)
                        {
                            JSONObject jsonObject=jsonArray.getJSONObject(i);
                            ShopDetails shopDetails=new ShopDetails();
                            shopDetails.setItem_name(jsonObject.getString("item_name"));
                            shopDetails.setItem_image(jsonObject.getString("image"));
                            shopDetails.setItem_price(jsonObject.getString("price"));
                            shopDetails.setItem_desc(jsonObject.getString("ingredients"));
                            cat_item_list.add(shopDetails);
                        }
                        if(cat_item_list!=null)
                        {

                            categoryItemAdapter.notifyDataSetChanged();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(getActivity(), "Unable to connect. Please check your connection.", Toast.LENGTH_SHORT).show();

            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("shoppe_id", shoppe_id);
                return params;
            }
        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                60000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        stringRequest.setShouldCache(false);
        requestQueue.add(stringRequest);
    }
    private static SSLSocketFactory createSslSocketFactory() {
        TrustManager[] byPassTrustManagers = new TrustManager[]{new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }

            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }
        }};

        SSLContext sslContext = null;
        SSLSocketFactory sslSocketFactory = null;
        try {
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, byPassTrustManagers, new SecureRandom());
            sslSocketFactory = sslContext.getSocketFactory();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
          Log.e(TAG, StringUtils.EMPTY, e);
        } catch (KeyManagementException e) {
           Log.e(TAG, StringUtils.EMPTY, e);
        }
        return sslSocketFactory;
    }
    public final boolean isInternetOn() {
        ConnectivityManager connec = (ConnectivityManager) getActivity().getSystemService(getActivity().getBaseContext().CONNECTIVITY_SERVICE);
        if (connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTED ||
                connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED) {

            return true;
        } else if (
                connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                        connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.DISCONNECTED) {

            return false;
        }
        return false;
    }
}

2 个答案:

答案 0 :(得分:0)

你需要在接收来自凌空的响应时使用验证,只需使用这样的条件:

 if(response!=null&&response.length()>10){
    try {
        JSONArray jsonArray=new JSONArray(response);
        for(int i=0;i<jsonArray.length();i++)
        {
            JSONObject jsonObject=jsonArray.getJSONObject(i);
            ShopDetails shopDetails=new ShopDetails();
            shopDetails.setItem_name(jsonObject.getString("item_name"));
            shopDetails.setItem_image(jsonObject.getString("image"));
            shopDetails.setItem_price(jsonObject.getString("price"));
            shopDetails.setItem_desc(jsonObject.getString("ingredients"));
            cat_item_list.add(shopDetails);
        }
        if(cat_item_list!=null)
        {

            categoryItemAdapter.notifyDataSetChanged();
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}else{
    Log.e("invalid","invalide responce");
}

OR  还添加条件: cat_id!= 0或者cat_id!= null  String url = config.api_url +“view_cat_item.php?cat_id =”+ cat_id;

答案 1 :(得分:0)

我认为这是因为当您切换片段时一次又一次地创建请求。所以当您通过覆盖onStop()方法

离开片段时可以取消截击请求
@Override
public void onStop() {
    super.onStop();
    VolleySingleton.getInstance(getActivity()).getRequestQueue().cancelAll(VolleySingleton.TAG);
}

您可以像这样设置标记

jsonObjectRequest.setTag(VolleySingleton.TAG);

VolleySingleton.java

public class VolleySingleton {
    private static VolleySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;
    public static final String TAG = "tagData";

    private VolleySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized VolleySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new VolleySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}