Volley GET请求冻结应用
我正在从API下载大型JSON文件,然后将其写入文件。获取JSON我使用了一个VolleySingleton类和我的GET方法;Volley 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()我的应用程序冻结,停止工作,你会得到一个选项,关闭应用程序或等待,我认为排球是异步的,我这么什么做错了?
验证结果是,请求是异步的。即:在后台线程中执行。我认为原因是因为你有一个大的JSON。
尝试注释以下LOC和应用程式是否冻结。
Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show();
如果应用程序现在不冻结,那是因为响应字符串太大。
在这种情况下,您还需要在AsyncTask中执行响应处理。
注意:不能在UI线程以外的线程中显示Toast。但是,假设你试图解析json并将其保存到SQLite数据库,那么你可以在AsyncTask中执行此操作。
如果应用程序在评论上述LOC后仍然冻结,那么其他地方有问题。
啊,现在我觉得很愚蠢,我通常会登录,不知道为什么我要在那里敬酒。多谢,伙计! –
不客气。 –
尝试添加超时和最大试图在这样
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线程并防止阻塞/崩溃的问题。而不是在onResponse
中生成Toast
消息,使用Log.v("NETLOG", response.toString());
将大文本内容加载到Toast中可能会冻结UI。该请求是异步的。 onResponse不是。 –
发布您的代码。 –