我从API下载一个大型JSON文件,然后将其写入文件。要获取JSON我使用VolleySingleton类和我的GET方法;
public void sendJSONRequest(){
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
URL,
(String) null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mRequestQueue.add(jsonObjectRequest);
}
但是当我在我的Activity的OnCreate方法上调用sendJSONRequest()时,我的应用程序会冻结并停止工作,您将获得关闭应用程序或等待的选项,我认为Volley是异步的,所以我做错了什么?
答案 0 :(得分:2)
尝试在排球请求中添加超时和最大尝试策略,如下所示
final int CONNTIMEOUT=30000;
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,urlBuffer.toString(),null,
new Response.Listener<JSONObject>(){
@Override
public void onResponse(JSONObject response) {
Log.i(Constants.NETLOG, "Volley response= " + response.toString());
//Success response
if(dialog!=null && dialog.isShowing())
{dialog.dismiss();}
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
Log.e(Constants.NETLOG, "VolleyError response= " + error.toString());
if(dialog!=null && dialog.isShowing())
{dialog.dismiss();}
//Error in response
}
});
jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(
CONNTIMEOUT,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Volley.newRequestQueue(mContext).add(jsonObjReq);
ProgressDialog dialog = ProgressDialog.show(mContext, "Please wait", "Processing.........");
一旦完成此操作,请在后台线程中执行成功响应过程,如果根据您的问题有大量数据使用AsyncTask
释放您的UI线程并防止阻塞/崩溃。而不是在Toast
中发送onResponse
条消息,请使用Log.v("NETLOG", response.toString());
验证结果
答案 1 :(得分:2)
是的,请求是异步的。即:在后台线程中执行。我认为原因是因为您拥有大量的JSON。
尝试评论以下LOC并查看该应用是否会冻结。
Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show();
如果应用现在没有冻结,那么因为响应字符串太大了。
在这种情况下,您还需要在AsyncTask中执行响应处理。
注意:您无法在UI线程以外的线程中显示Toast。但是假设您正在尝试解析json并将其保存到SQLite数据库,那么您可以在AsyncTask中执行此操作。
如果应用程序在评论上述LOC后仍然冻结,则其他地方出现问题。