【问题标题】:Api calls from a fragment using Volley使用 Volley 从片段调用 Api
【发布时间】:2017-11-23 02:34:16
【问题描述】:

我正在从我的片段进行 API 调用并使用 volley 获取响应。每次单击该片段选项卡时,都会再次进行 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;
    }
}

【问题讨论】:

  • 在 Preference 中保留一个布尔值,并在每次单击此片段时检查其值。
  • 好吧..没有完全明白你所说的。对安卓来说是全新的。事实上,这是我的第一个安卓应用。你能详细说明一下吗?谢谢!!
  • 我试图在下面的回答中进行解释,希望对您有所帮助。必须还有其他方法可以做到这一点,但目前我只能想到这个答案,如果这个答案对你有帮助,请接受它。

标签: android android-fragments fragment android-volley


【解决方案1】:

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

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

2- 每当调用 API 时,在 Preference 中保留一个布尔值-

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多