当android中的活动开始时,Json请求被处理多次

时间:2016-01-20 15:06:01

标签: android json android-volley

我是Android新手,自上次编码以来已经很久了。对不起,如果这是一个虚拟问题。

我的应用程序要求用户引入将在API中搜索的索引字词。然后,用户输入用于创建请求JSONObjects的URL。这是在第一个活动中完成的。第二个活动接收URL并向API发出请求。

我正在使用第三方库在类似Tinder的刷卡效果视图(https://github.com/Diolor/Swipecards)中显示结果。这个库有一个名为onAdapterAboutToEmpty的方法,其中包含了JSONObjectRequest。我也在使用Volley来创建RequestQueue。

但是,在创建第二个活动时,会调用此方法三次。我只需要调用一次。所以,我的问题如下:

  • 这是由活动生命周期引起的,还是由第三方库引起的问题?
  • 这会影响应用效果吗?

这里有代码:

public class DisplayQueryActivity extends AppCompatActivity {

RequestQueue mRequestQueue;
ResearchAdapter mJSONAdapter;
SwipeFlingAdapterView mSwipePaper;
String user_urlQuery;
public int index_Springer_Query;
public int number_papers_deleted = 0;
static final int PICK_USER_ACTION = 1;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_query);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //Get data from previous Activity
    Intent intentDisplayQuery = getIntent();
    user_urlQuery = intentDisplayQuery.getStringExtra(UserInput.EXTRA_QUERY);
    index_Springer_Query = extractFieldQuery(user_urlQuery, URL_RESULT_STARTING);

    mJSONAdapter = new ResearchAdapter(this, getLayoutInflater(), getProviderLogoImage(user_urlQuery));
    mRequestQueue = Volley.newRequestQueue(this);
    mSwipePaper = (SwipeFlingAdapterView) findViewById(R.id.swipe_content);
}

@Override
protected void onStart(){
    super.onStart();

    mSwipePaper.setAdapter(mJSONAdapter);
    displaySwipeMode();
}

private void displaySwipeMode(){
        mSwipePaper.setFlingListener(new SwipeFlingAdapterView.onFlingListener() {

        @Override
        public void removeFirstObjectInAdapter() {

            mJSONAdapter.remove(0);
            number_papers_deleted++;
            mJSONAdapter.notifyDataSetChanged();
        }

        @Override
        public void onLeftCardExit(Object dataObject) {

            Toast.makeText(DisplayQueryActivity.this, "Left!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onRightCardExit(Object dataObject) {

            Toast.makeText(DisplayQueryActivity.this, "Right!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onAdapterAboutToEmpty(int itemsInAdapter) {
             sendJsonRequest();
        }

        @Override
        public void onScroll(float v) {

        }
    });

}

private void sendJsonRequest() {
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
            user_urlQuery,
            (String) null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    mJSONAdapter.updateData(response.optJSONArray(VR_RECORDS));
                    Log.d("Console says: ", response.toString());
                }
            },
            new Response.ErrorListener(){
                @Override
                public void onErrorResponse(VolleyError error){
                    Log.d("Console says: ", error.getMessage().toString());
                }

            });
    mRequestQueue.add(request);
}

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:-1)

欢迎使用Stack Overflow,这种行为很正常。代码基本上是在内存中保存三个项目。它在前三个加载,然后当你向右滑动它在下一个项目加载到内存并释放第一个...

例如

1,2,3被加载到内存

您在第1号右侧滑动。

然后从内存中删除

1并加载编号4

你现在有2,3,4的内存。

希望这有帮助