【问题标题】:Volley error occurs while swiping between fragments/viewpager在片段/viewpager 之间滑动时发生 Volley 错误
【发布时间】:2017-12-05 06:41:05
【问题描述】:

在我的活动中,所有选项卡都是动态创建的。每个滑动的 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;
    }
}

【问题讨论】:

    标签: java android android-fragments android-volley


    【解决方案1】:

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

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

    或 还添加条件: cat_id!=0 或 cat_id!=null 字符串 url=config.api_url+"view_cat_item.php?cat_id="+cat_id;

    【讨论】:

      【解决方案2】:

      我认为这是因为当您切换片段时,凌空创建请求一次又一次。所以你可以通过覆盖 onStop() 方法从 Fragment 离开时取消 volley 请求

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

      【讨论】:

      • 是google volley singleton类。我在代码中添加了类
      猜你喜欢
      • 2016-05-31
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多