Android 使用截击从片段调用Api

Android 使用截击从片段调用Api,android,android-fragments,fragment,android-volley,Android,Android Fragments,Fragment,Android Volley,我正在从片段中调用API,并使用截击获得响应。每次单击片段选项卡时,都会再次进行API调用。我希望API调用只发生一次。有没有办法做到这一点?我试图寻找解决办法,但没有发现任何有用的东西。下面是我的片段代码 public class Tab3News extends Fragment { private RecyclerView newsView; private NewsAdapter newsadapter; String myxmlResponse; @O

我正在从片段中调用API,并使用截击获得响应。每次单击片段选项卡时,都会再次进行API调用。我希望API调用只发生一次。有没有办法做到这一点?我试图寻找解决办法,但没有发现任何有用的东西。下面是我的片段代码

public class Tab3News extends Fragment {

    private RecyclerView newsView;
    private NewsAdapter newsadapter;
    String myxmlResponse;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d("Making request again","hello");
        View layout = inflater.inflate(R.layout.tab3news, container, false);
        newsView = (RecyclerView) layout.findViewById(R.id.newstable);
        String symPassed = ((SendString)getActivity()).message;

        String XmlURL = "http://demoapplication-env.us-east-2.elasticbeanstalk.com/?symbol="+symPassed+"&indicator=XML";


        RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext());

        StringRequest req = new StringRequest(Request.Method.GET, XmlURL,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //processData(response);

                            myxmlResponse = response;

                            newsView.setHasFixedSize(true);
                            //newsView.setItemAnimator(new DefaultItemAnimator());
                            newsView.setLayoutManager(new LinearLayoutManager(getActivity()));
                            newsView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
                            newsadapter = new NewsAdapter(getActivity(),getData());
                            newsView.setAdapter(newsadapter);

                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        } catch (XmlPullParserException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // handle error response
                    }
                }
        );
        queue.add(req);


        return layout;
    }
}
public类Tab3News扩展片段{
private RecyclerView新闻视图;
私有新闻适配器;
字符串myxmlResponse;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
Log.d(“再次提出请求”、“你好”);
视图布局=充气机。充气(R.layout.tab3news,container,false);
newsView=(RecyclerView)layout.findViewById(R.id.newstable);
字符串symPassed=((SendString)getActivity())。消息;
字符串XmlURL=”http://demoapplication-env.us-east-2.elasticbeanstalk.com/?symbol=“+symPassed+”&indicator=XML”;
RequestQueue=Volley.newRequestQueue(getActivity().getApplicationContext());
StringRequest req=新的StringRequest(Request.Method.GET,XmlURL,
新的Response.Listener()
{
@凌驾
公共void onResponse(字符串响应){
试一试{
//过程数据(响应);
myxmlResponse=响应;
setHasFixedSize(true);
//setItemAnimator(新的DefaultItemAnimator());
setLayoutManager(新的LinearLayoutManager(getActivity());
addItemDecoration(新的DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL_LIST));
newsadapter=新的newsadapter(getActivity(),getData());
setAdapter(newsadapter);
}捕获(不支持的编码异常e){
e、 printStackTrace();
}catch(XMLPullParseRexE){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener()
{
@凌驾
公共无效onErrorResponse(截击错误){
//处理错误响应
}
}
);
队列添加(req);
返回布局;
}
}

有两种方法可以做到这一点-

1-从该片段的父活动调用API,并相应地使用“
setArguments(bundle)
”将数据传递给该片段,通过这样做,您的API不会在每次加载片段时都被调用

public class Tab3News extends Fragment {

    private RecyclerView newsView;
    private NewsAdapter newsadapter;
    String myxmlResponse;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d("Making request again","hello");
        View layout = inflater.inflate(R.layout.tab3news, container, false);
        newsView = (RecyclerView) layout.findViewById(R.id.newstable);
        String symPassed = ((SendString)getActivity()).message;

        String XmlURL = "http://demoapplication-env.us-east-2.elasticbeanstalk.com/?symbol="+symPassed+"&indicator=XML";


        RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext());

        StringRequest req = new StringRequest(Request.Method.GET, XmlURL,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //processData(response);

                            myxmlResponse = response;

                            newsView.setHasFixedSize(true);
                            //newsView.setItemAnimator(new DefaultItemAnimator());
                            newsView.setLayoutManager(new LinearLayoutManager(getActivity()));
                            newsView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
                            newsadapter = new NewsAdapter(getActivity(),getData());
                            newsView.setAdapter(newsadapter);

                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        } catch (XmlPullParserException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // handle error response
                    }
                }
        );
        queue.add(req);


        return layout;
    }
}
2-每当调用API时,在首选项中保留一个布尔值-

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
        mMyPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        boolean isFirstTime = mMyPrefs.getBoolean("IS_FIRST_TIME", true);
       if (mIsFirstTime)
                    {
                        SharedPreferences.Editor editPrefs = mMyPrefs.edit();
                        editPrefs.putBoolean("IS_FIRST_TIME", false);
                        editPrefs.apply();

                        callAPI();
                    }
      else
      {
             //TO DO YOUR STUFF
      }
}

我认为最好在活动中调用api并通过bundle传递参数,而不是在共享首选项中使用标志。再说一次,这是我个人的意见。

优先选择一个布尔值,每次单击此片段时都检查其值。好的..没有完全理解您所说的。对android来说是全新的。事实上,这是我的第一个android应用程序。你能详细说明一下吗?谢谢我试图在下面的回答中解释,希望这能对你有所帮助。肯定还有其他方法可以做到这一点,但目前我只能想到这个答案,接受它,如果这个答案对你有帮助的话。