在我的活动中,所有标签都是动态创建的。每个刷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;
}
}
答案 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;
}
}