2014-11-03 43 views
-1

我有一个navigation drawer包含2个项目。现在在我的第一个项目点击,我加载数据使用asynctask和加载的数据填充在相应片段的列表视图。现在当我切换到第二项时,我再次使用AsyncTask加载第二个片段的数据,并在listview中显示它。AsyncTask每次调用

现在问题就开始了。当我回到第一个片段时,我的 asyncTask再次被调用,并且数据再次从 服务器中获取,我想要阻止它并直接加载我的数据,如果它已经加载一次 。

请建议

P.S - 请询问代码,如果有人需要它。 USERPAYFRAGMENT

public class UserPay extends Fragment { 

ProgressDialog prg; 
Properties prop; 

private PrefSingleton mMyPreferences; 
private JSONParser jsonParser = new JSONParser(); 

ArrayList<HashMap<String, String>> RequestList; 
HashMap<String, String> map; 
UserAdapter req_adp; 
ListView req; 
private boolean flag; 

@Override 
public void onAttach(Activity activity) { 
    // TODO Auto-generated method stub 
    super.onAttach(activity); 
    Toast.makeText(getActivity(), "ATTACHED", 1000).show(); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    Toast.makeText(getActivity(), "CREATE", 1000).show(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.user_pay, container, false); 

    initViews(rootView); 
    Toast.makeText(getActivity(), "ONCREATEVIEW", 1000).show(); 
    return rootView; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    Toast.makeText(getActivity(), "ONACTIVITYCREATED", 1000).show(); 
    mMyPreferences = PrefSingleton.getInstance(); 
    mMyPreferences.Initialize(getActivity()); 
    RequestList = new ArrayList<HashMap<String, String>>(); 

    Resources resources = this.getResources(); 
    AssetManager assetManager = resources.getAssets(); 
    try { 
     InputStream inputStream = assetManager.open("jsonURL.properties"); 
     prop = new Properties(); 
     prop.load(inputStream); 
    } catch (IOException e) { 
     System.err.println("Failed to open jsonURL property file"); 
     e.printStackTrace(); 
    } 

    req_adp = new UserAdapter(getActivity(), RequestList); 
    req.setAdapter(req_adp); 

    if (!flag) { 
     new GetRequests().execute(); 
    } else { 

    } 
} 

@Override 
public void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    Toast.makeText(getActivity(), "ONSTART", 1000).show(); 
} 

@Override 
public void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    Toast.makeText(getActivity(), "ONRESUME", 1000).show(); 
} 

private void initViews(View v) { 
    req = (ListView) v.findViewById(R.id.req_list); 

} 

private class GetRequests extends AsyncTask<Void, Void, Integer> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     prg = new ProgressDialog(getActivity()); 
     prg.setIndeterminate(true); 
     prg.setMessage("Fetching Pending Requests..."); 
     prg.setCanceledOnTouchOutside(false); 
     prg.show(); 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 

     List<NameValuePair> params1 = new ArrayList<NameValuePair>(); 
     params1.add(new BasicNameValuePair("userID", mMyPreferences 
       .getPreference("LoginId"))); 

     String error_code = null; 
     Log.e("URL ", "is" + prop.getProperty("GET_REQUESTS_URL")); 

     try { 
      // getting JSON string from URL 
      JSONObject json = jsonParser.makeHttpRequest(
        Appconstant.GET_REQUESTS_URL, "POST", params1); 

      // Check your log cat for JSON response 
      Log.d("Inbox JSON: ", json.toString()); 

      JSONObject jsonObj = json.getJSONObject("data"); 
      error_code = jsonObj.getString("Error_Code"); 
      RequestList.clear(); 

      if ("1".equals(error_code)) { 

       JSONArray jArray = jsonObj.getJSONArray("result"); 
       for (int i = 0; i < jArray.length(); i++) { 
        map = new HashMap<String, String>(); 

        JSONObject jsonObj1 = jArray.getJSONObject(i); 
        String FBankId = jsonObj1 
          .getString("payment_from_bank_id"); 
        String DestBankId = jsonObj1 
          .getString("payment_to_bank_id"); 
        String FBank = jsonObj1.getString("fBank"); 
        String TBank = jsonObj1.getString("tBank"); 
        String reason = jsonObj1.getString("payment_reason"); 
        String amt = jsonObj1.getString("amount"); 
        String p_type = jsonObj1.getString("payment_type"); 
        String status = jsonObj1.getString("status"); 
        String r_date = jsonObj1 
          .getString("request_created_date"); 

        map.put("FBankId", FBankId); 
        map.put("TBankId", DestBankId); 
        map.put("SourceBank", FBank); 
        map.put("DestBank", TBank); 
        map.put("ReqDate", r_date); 
        map.put("PayReason", reason); 
        map.put("Amt", amt); 
        map.put("PayType", p_type); 
        map.put("Status", status); 

        if (status.equals("pending")) { 
         if (p_type.equals("cheque") 
           || p_type.equals("Net Banking")) { 
          RequestList.add(map); 
         } 
        } 
       } 
      } 
     } catch (JSONException e) { 

      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return Integer.parseInt(error_code); 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 

     if (prg.isShowing()) { 
      prg.cancel(); 
     } 

     if (result == 2) { 
      Toast.makeText(getActivity(), 
        "No User Request Details Available.Please Try Again", 
        Toast.LENGTH_SHORT).show(); 
     } 
     req_adp.notifyDataSetChanged(); 
     flag = true; 
    } 
} 

@Override 
public void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    Toast.makeText(getActivity(), "ONPAUSE",1000).show(); 
} 

@Override 
public void onStop() { 
    // TODO Auto-generated method stub 
    super.onStop(); 
    Toast.makeText(getActivity(), "ONSTOP", 1000).show(); 
} 

@Override 
public void onDestroyView() { 
    // TODO Auto-generated method stub 
    super.onDestroyView(); 
    Toast.makeText(getActivity(), "ONDESTROYVIEW", 1000).show(); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    Toast.makeText(getActivity(), "ONDESTROY", 1000).show(); 
} 

@Override 
public void onDetach() { 
    // TODO Auto-generated method stub 
    super.onDetach(); 
    Toast.makeText(getActivity(), "ONDETACH", 1000).show(); 
} 
} 
+0

分享您的代码 – 2014-11-03 06:46:12

+0

我认为您应该提供代码(以避免downvotes)。 – turtle 2014-11-03 06:46:52

+0

使用'FragmentTransaction'' add'而不是'replace'将第一个片段保留在后退栈中,当你回来时它不会再次加载数据。 – 2014-11-03 06:52:19

回答

1

有2种方式来解决

1 - 本地存储数据,并根据适当条件检查

2利用存储的数据 - 如果您的应用程序是基于这2个片段,只需创建这些片段的实例并存储在父活动的成员变量中。不要再次重复创建机会