截击请求管理器
Volley Request Manager
我正在使用 Volley,但是我在 JSON 解析数据时遇到了一些问题,这很可能是因为 volley 没有实现类似 AsyncTask 的 onPostExecute() 之类的东西,我得到了一些错误的重复数据列出项目。
然后我发现了这个:https://github.com/yakivmospan/volley-request-manager#custom-listener-implementation-
有人用过吗?如何将它添加到我当前的 Volley 代码中?
这里有关于我的问题的更多细节Volley not sending correct data. How to implement an alternative to onPostExecute()?
更新
应要求,一些代码。这是一个调用另一个 class 上的方法的按钮,它使用 Volley 请求一些原始 JSON 数据(NovaJSON),然后将 JSON 发送到解析器 class(NovaParser):
info.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String instanceDetail = NovaJSON.shared().receiveDetail(getId());
Dialog dialog = new Dialog(v.getContext());
dialog.setContentView(R.layout.instances_info);
TextView image = (TextView) dialog.findViewById(R.id.imageInstance);
TextView flavor = (TextView) dialog.findViewById(R.id.flavorInstance);
dialog.setTitle(name.getText() + " Details");
if (instanceDetail != null) {
image.setText(" \u2022 image : " + NovaParser.shared().parseImages(instanceDetail));
flavor.setText(" \u2022 flavor : " + NovaParser.shared().parseFlavor(instanceDetail));
}
dialog.show();
}
});
这是在 Nova 上执行 Volley 请求的方法JSON class:
public void getJSONdetail() {
final String authToken = getAuth();
String novaURL = getNova();
novaURL = novaURL+"/servers/"+id;
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSONdetail(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSONdetail(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("User-Agent", "stackerz");
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
queue.add(getRequest);
}
然后它从服务器发送 JSON 作为字符串,使用以下方法进行解析:
public static String parseImages(String imagesDetail){
ArrayList<HashMap<String, String>> imagesList = NovaParser.shared().getImagesList();
String temp = null;
JSONObject novaDetail = null;
try {
novaDetail = new JSONObject(imagesDetail);
JSONObject server = novaDetail.getJSONObject("server");
JSONObject image = server.getJSONObject("image");
if (imagesList !=null){
temp = image.getString("id");
for (Map<String,String> map : imagesList) {
if (map.containsValue(temp)) {
temp = map.get(NAME);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return temp;
}
public static String parseFlavor(String instanceDetail){
ArrayList<HashMap<String, String>> flavorList = NovaParser.shared().getFlavorList();
String temp = null;
JSONObject novaDetail = null;
try {
novaDetail = new JSONObject(instanceDetail);
JSONObject server = novaDetail.getJSONObject("server");
JSONObject flavor = server.getJSONObject("flavor");
if (flavorList !=null){
temp = flavor.getString("id");
for (Map<String,String> map : flavorList) {
if (map.containsValue(temp)) {
temp = map.get(NAME);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return temp;
}
当我按下按钮时,一旦对话框显示为空值。当我第二次按下它时,我得到了正确的解析数据。基本上我第一次点击按钮时 instanceDetail 字符串为空,因为 Volley 没有完成它的工作然后我点击第二次它相应地加载值因为它终于完成了第一个请求。
我知道 Volley 是异步的,请求是并行发生的,响应有时不是即时的,但是我需要某种进度条或旋转轮来向用户提供应用正在等待数据的一些反馈。可以使用 AsyncTask 完成,但使用 Volley 似乎不可能。
我认为你的问题不是因为Volley
。
检查您发送和接收的参数。
但是,如果您需要 onPostExcecute
,您可以使用 Volley 的回调:
Response.Listener<JSONObject>
和 Response.ErrorListener()
在请求后调用。
关于 Volley request manager
只需将所有截击电话切换为适当的 Volley request manager
电话
我通过完全放弃 Volley 并转向 Retrofit 解决了我的问题。我将所有调用设置为 sync/blocking,使用 try/catches 计算出 exceptions/errors,并在 OkHTTP 客户端上设置了一个短超时。现在一切如我所愿。
我正在使用 Volley,但是我在 JSON 解析数据时遇到了一些问题,这很可能是因为 volley 没有实现类似 AsyncTask 的 onPostExecute() 之类的东西,我得到了一些错误的重复数据列出项目。
然后我发现了这个:https://github.com/yakivmospan/volley-request-manager#custom-listener-implementation-
有人用过吗?如何将它添加到我当前的 Volley 代码中?
这里有关于我的问题的更多细节Volley not sending correct data. How to implement an alternative to onPostExecute()?
更新
应要求,一些代码。这是一个调用另一个 class 上的方法的按钮,它使用 Volley 请求一些原始 JSON 数据(NovaJSON),然后将 JSON 发送到解析器 class(NovaParser):
info.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String instanceDetail = NovaJSON.shared().receiveDetail(getId());
Dialog dialog = new Dialog(v.getContext());
dialog.setContentView(R.layout.instances_info);
TextView image = (TextView) dialog.findViewById(R.id.imageInstance);
TextView flavor = (TextView) dialog.findViewById(R.id.flavorInstance);
dialog.setTitle(name.getText() + " Details");
if (instanceDetail != null) {
image.setText(" \u2022 image : " + NovaParser.shared().parseImages(instanceDetail));
flavor.setText(" \u2022 flavor : " + NovaParser.shared().parseFlavor(instanceDetail));
}
dialog.show();
}
});
这是在 Nova 上执行 Volley 请求的方法JSON class:
public void getJSONdetail() {
final String authToken = getAuth();
String novaURL = getNova();
novaURL = novaURL+"/servers/"+id;
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSONdetail(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSONdetail(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("User-Agent", "stackerz");
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
queue.add(getRequest);
}
然后它从服务器发送 JSON 作为字符串,使用以下方法进行解析:
public static String parseImages(String imagesDetail){
ArrayList<HashMap<String, String>> imagesList = NovaParser.shared().getImagesList();
String temp = null;
JSONObject novaDetail = null;
try {
novaDetail = new JSONObject(imagesDetail);
JSONObject server = novaDetail.getJSONObject("server");
JSONObject image = server.getJSONObject("image");
if (imagesList !=null){
temp = image.getString("id");
for (Map<String,String> map : imagesList) {
if (map.containsValue(temp)) {
temp = map.get(NAME);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return temp;
}
public static String parseFlavor(String instanceDetail){
ArrayList<HashMap<String, String>> flavorList = NovaParser.shared().getFlavorList();
String temp = null;
JSONObject novaDetail = null;
try {
novaDetail = new JSONObject(instanceDetail);
JSONObject server = novaDetail.getJSONObject("server");
JSONObject flavor = server.getJSONObject("flavor");
if (flavorList !=null){
temp = flavor.getString("id");
for (Map<String,String> map : flavorList) {
if (map.containsValue(temp)) {
temp = map.get(NAME);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return temp;
}
当我按下按钮时,一旦对话框显示为空值。当我第二次按下它时,我得到了正确的解析数据。基本上我第一次点击按钮时 instanceDetail 字符串为空,因为 Volley 没有完成它的工作然后我点击第二次它相应地加载值因为它终于完成了第一个请求。
我知道 Volley 是异步的,请求是并行发生的,响应有时不是即时的,但是我需要某种进度条或旋转轮来向用户提供应用正在等待数据的一些反馈。可以使用 AsyncTask 完成,但使用 Volley 似乎不可能。
我认为你的问题不是因为Volley
。
检查您发送和接收的参数。
但是,如果您需要 onPostExcecute
,您可以使用 Volley 的回调:
Response.Listener<JSONObject>
和 Response.ErrorListener()
在请求后调用。
关于 Volley request manager
只需将所有截击电话切换为适当的 Volley request manager
电话
我通过完全放弃 Volley 并转向 Retrofit 解决了我的问题。我将所有调用设置为 sync/blocking,使用 try/catches 计算出 exceptions/errors,并在 OkHTTP 客户端上设置了一个短超时。现在一切如我所愿。