我的截击请求正在运行,但我有这个问题。
如下图所示是我的典型截击请求。这是从表中获取行并在带有cardviews的recyclerview中显示它们。
我已将整个过程放在一个易于调用的方法中。 我在'刷新'工具栏中的按钮。当我在第一个请求尚未完成之前碰巧多次点击它时,卡片视图会重复,就像请求两次行一样。好吧,这个方法被调用了两次。我想如果我把新的ArrayList<>();方法开始时的事情应该解决它,但我错了。
以下是我的想法。
1. load() is called.
2. new instance of myList is created.
3. first request is sent.
4. load() is called again.
5. new instance of myList is created.
6. second request is sent.
7. first request returns json.
8. parses and adds to second myList instance.
9. second request returns json.
10. parses and adds to myList instance.
这是我的典型截击请求。
// List<Objectbuilder> myList; is declared in class.
private void load(){
myLIST= new ArrayList<>();
RequestQueue requestQueue = Volley.newRequestQueue(TeacherEditQuizQuestionList.this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("RESULT");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
String tempCOL1 = jsonObject1 .getString("COL1");
String tempCOL2 = jsonObject1 .getString("COL2");
String tempCOL3 = jsonObject1 .getString("COL3");
Objectbuilder newobject = newObjectbuilder(tempCOL1 ,tempCOL2 ,tempCOL3 );
myLIST.add(ql_newobject );
}
adapter recycler_adapter = new adapter(Activity.this,myLIST);
recycler_display.setAdapter(ql_adapter );
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(Activity.this, ""+error, Toast.LENGTH_SHORT).show();
}
})
};
requestQueue.add(stringRequest);
}
该方法适用于OnCreate和&#34; Refresh&#34;工具栏上的按钮。如果我太快或反复点击刷新按钮,则cardviews显示为
[Row1 info ]
[Row2 info ]
[Row3 info ]
[Row1 info ]
[Row2 info ]
[Row3 info ]
我的意思是,它并没有那么多麻烦。如果我单击刷新按钮一次并耐心等待,它将自动重置并正常显示正确的行数并且不重复。我刚刚到这里以防万一有更好的方法可以做到这一点。也许我可能会从你们身上学到救命的伎俩,这可能会挽救这个项目和本学期大声笑。
答案 0 :(得分:0)
创建onResponse
的本地列表,并使用您的响应数据填充该列表。完全填充并准备好应用于您的适配器后,您可以创建或清除myLIST
并填写它。两个未完成的load
调用将在他们需要的时间点(在onResponse
处理程序)。响应处理程序不应该互相抢占,最后一个分配(或清除)myLIST
胜利。如果响应处理程序有可能相互抢占,则添加一些同步(但不一定必要)。