如何在不再次运行JSON的情况下调用android片段?

如何在不再次运行JSON的情况下调用android片段?,android,json,android-studio,android-fragments,android-volley,Android,Json,Android Studio,Android Fragments,Android Volley,我希望如果fragemnt被召回,片段show view it first call不会再次运行json。我的代码在我再次打开片段后,片段再次被请求json。我是java/android编程的初学者,但我试图添加不同的教程来创建一个定制的应用程序,它可以满足我的需要,这对这里的大多数人来说可能很容易,但我被卡住了 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance

我希望如果fragemnt被召回,片段show view it first call不会再次运行json。我的代码在我再次打开片段后,片段再次被请求json。我是java/android编程的初学者,但我试图添加不同的教程来创建一个定制的应用程序,它可以满足我的需要,这对这里的大多数人来说可能很容易,但我被卡住了

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
    // Creating volley request obj
    JsonArrayRequest billionaireReq = new JsonArrayRequest(getURL,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    url_maps = new HashMap<String, String>();
                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            url_maps.put(obj.getString("title") + " - " + obj.getString("releaseYear"), obj.getString("image"));

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

                    for (String name : url_maps.keySet()) {
                        TextSliderView textSliderView = new TextSliderView(getActivity());
                        // initialize a SliderLayout
                        textSliderView
                                .description(name)
                                .image(url_maps.get(name))
                                .setScaleType(BaseSliderView.ScaleType.CenterCrop)
                                .setOnSliderClickListener(HomeFragment.this);

                        //add your extra information
                        textSliderView.bundle(new Bundle());
                        textSliderView.getBundle().putString("extra", name);

                        mSlider.addSlider(textSliderView);
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getActivity(), "network issue: please enable wifi/mobile data", Toast.LENGTH_SHORT).show();
        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(billionaireReq);


}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_home, container, false);
    mSlider = (SliderLayout) view.findViewById(R.id.slider_home);
    gridView = (GridView) view.findViewById(R.id.grid);
    gridView.setAdapter(new CustomAndroidGridViewAdapter(getActivity(), gridViewStrings, gridViewImages));
    mSlider.setPresetTransformer(SliderLayout.Transformer.Stack);
    mSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Top);
    mSlider.setCustomAnimation(new DescriptionAnimation());
    mSlider.setDuration(4000);
    return view;
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getString(ARG_PARAM1);
mParam2=getArguments().getString(ARG_PARAM2);
}
//创建截击请求对象
JsonArrayRequest亿万AIREQ=新的JsonArrayRequest(getURL,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONArray响应){
url_maps=新HashMap();
//解析json
对于(int i=0;i
“我的代码在我再次打开片段后,片段再次被请求json” 我从你的问题中得到的是,如果你过去已经访问过同一个片段,你不想再次请求json。您可以做一件事,当您在saveStateInstance(Bundle Bundle)override方法中首次访问fragment save to json对象并将其保存到Bundle中时,以及当您重新访问fragment check并从onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle savedInstanceState)方法的参数Bundle中提取json时。通过这种方式,您可以维护片段的状态。

“我的代码在再次打开片段后,片段将再次被请求json”
我从你的问题中得到的是,如果你过去已经访问过同一个片段,你不想再次请求json。您可以做一件事,当您在saveStateInstance(Bundle Bundle)override方法中首次访问fragment save to json对象并将其保存到Bundle中时,以及当您重新访问fragment check并从onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle savedInstanceState)方法的参数Bundle中提取json时。通过这种方式,您可以维护片段的状态。

重写
onSaveInstanceState
方法以保存json实例。在您的情况下,uou将其存储在
字符串
变量或实现
可包裹接口的对象中。要保存的有效数据结构列表如下所示:

您必须找到恢复数据的方法,您可以通过覆盖
onrestoreinnstancestate
方法来实现。或者,您可以在
onCreate
方法中执行此操作,方法是检查
savedInstanceState
是否存储数据:

这将在创建后运行:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // Restore data here
    yourJsonString = savedInstanceState.getString("yourString");
}
或者,您可以将其放入
onCreate
方法中:

if (savedInstanceState != null) {
    // Restore data here
    yourJsonString = savedInstanceState.getString("yourString");
} else{
    //else get your json normally
}

重写
onSaveInstanceState
方法以保存json实例。在您的情况下,uou将其存储在
字符串
变量或实现
可包裹接口的对象中。要保存的有效数据结构列表如下所示:

您必须找到恢复数据的方法,您可以通过覆盖
onrestoreinnstancestate
方法来实现。或者,您可以在
onCreate
方法中执行此操作,方法是检查
savedInstanceState
是否存储数据:

这将在创建后运行:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // Restore data here
    yourJsonString = savedInstanceState.getString("yourString");
}
或者,您可以将其放入
onCreate
方法中:

if (savedInstanceState != null) {
    // Restore data here
    yourJsonString = savedInstanceState.getString("yourString");
} else{
    //else get your json normally
}

如果您使用的是Viewpager,则只需添加

pager.setOffscreenPageLimit(limit)

如果您使用的是Viewpager,只需添加

pager.setOffscreenPageLimit(limit)

哦,是的,谢谢回答,但不仅仅是我保存到savedInstanceStat的json。我希望片段只在第一时间显示视图和恢复。第一次打开片段时的示例