简体   繁体   English

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

[英]Volley error occurs while swiping between fragments/viewpager

In my activity all tabs are created as dynamic. 在我的活动中,所有选项卡均创建为动态。 Each swiping json data is called. 每个滑动json数据都会被调用。 The volley error occurs after a number of swiping. 多次滑动后会出现齐射错误。 After this , no data is available on fragment and any of the other pages. 此后,片段和其他任何页面上都没有可用数据。 This is my code 这是我的代码

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;
    }
}

you need to use validation while receiving response from volley just use condition like that : 您需要在收到排球的回应时使用验证,只是使用类似这样的条件:

 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 also add condition on : cat_id!=0 OR cat_id!=null String url=config.api_url+"view_cat_item.php?cat_id="+cat_id; 或者还添加条件:cat_id!= 0 OR cat_id!= null字符串url = config.api_url +“ view_cat_item.php?cat_id =” + cat_id;

I think it happens because when you switch fragments volley create request again and again. 我认为发生这种情况是因为当您切换片段齐射时,会一次又一次地创建请求。 so you can cancel volley request when you leave from fragments by override onStop() method 因此,当您通过覆盖onStop()方法离开片段时,可以取消齐射请求

@Override
public void onStop() {
    super.onStop();
    VolleySingleton.getInstance(getActivity()).getRequestQueue().cancelAll(VolleySingleton.TAG);
}

you can set Tag like this 你可以这样设置标签

jsonObjectRequest.setTag(VolleySingleton.TAG);

VolleySingleton.java 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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM