当 JSONArray 大于 261 时应用程序崩溃
App crash when JSONArray is bigger than 261
有一个 JSON
包含公交车票信息。我们使用 volley 从网络服务中获取数据。之后,它获得了发送 adapter
和 broadcast
的这些总线信息。此外,某些仿真器设备也会出现此错误。
android.app.RemoteServiceException: can't deliver broadcast
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
我意识到如果 JSONArray 的长度大于 261,它就不会 运行 适配器。然后,我检查 JSONArray 是否大于 261,它发送到 261 为什么会发生这个问题?以及如何解决这个问题并将所有数据发送到适配器?
Bus.java
private void sendRequest(final String owner, final Map header) {
StringRequest stringRequest = new StringRequest(Request.Method.POST, MyConstants.URL + owner,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Log.e("AAAA" + owner, response);
try {
JSONObject object = new JSONObject(response);
if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_NOTAVAILABLE)) {
// servisten gelen cevap not_available ise
//// owner
sendVoyagesErrorBroadcast(owner, MyConstants.ERROR_NOTAVAILABLE);
} else if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_SUCCESS)) {
// servisten gösterilebilecek bir sonuç geldiyse
JSONArray result = object.getJSONArray(MyConstants.SERVICE_RESULT);
if (result.length()>0) {
JSONArray resultGoing = result.getJSONObject(0).getJSONArray("going");
sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_GOING, resultGoing);
}
// sendVoyagesArrayBroadcast
private void sendVoyagesArrayBroadcast(String target, JSONArray resultArray_) {
JSONArray resultArray = new JSONArray();
if (resultArray_.length()>261)
{
for(int i = 0; i < 261; i++) {
try {
resultArray.put(resultArray_.get(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
Log.e("resultArray","");
}
else
resultArray=resultArray_;
Intent intent = new Intent();
intent.setAction(BROADCAST_TAG + target);
intent.putExtra("data", resultArray.toString());
/*if(!target.contains("bus2")){
Log.e("sendSuccessBroadcast",target);
intent.putExtra("data", resultArray.toString());
}*/
context.sendBroadcast(intent);
}
这是由于bundle
,bundle
尺寸限制传递数据。如果要无线传输数据,请使用EventBus
,它可以处理足够的数据传输
使用分页。您可以通过两种方式执行此操作:
- 在您的本地应用中
- 使用网络服务
我建议使用选项 2。如果不是,则为此一次加载 10-20 个项目。
有一个 JSON
包含公交车票信息。我们使用 volley 从网络服务中获取数据。之后,它获得了发送 adapter
和 broadcast
的这些总线信息。此外,某些仿真器设备也会出现此错误。
android.app.RemoteServiceException: can't deliver broadcast
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
我意识到如果 JSONArray 的长度大于 261,它就不会 运行 适配器。然后,我检查 JSONArray 是否大于 261,它发送到 261 为什么会发生这个问题?以及如何解决这个问题并将所有数据发送到适配器?
Bus.java private void sendRequest(final String owner, final Map header) {
StringRequest stringRequest = new StringRequest(Request.Method.POST, MyConstants.URL + owner,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Log.e("AAAA" + owner, response);
try {
JSONObject object = new JSONObject(response);
if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_NOTAVAILABLE)) {
// servisten gelen cevap not_available ise
//// owner
sendVoyagesErrorBroadcast(owner, MyConstants.ERROR_NOTAVAILABLE);
} else if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_SUCCESS)) {
// servisten gösterilebilecek bir sonuç geldiyse
JSONArray result = object.getJSONArray(MyConstants.SERVICE_RESULT);
if (result.length()>0) {
JSONArray resultGoing = result.getJSONObject(0).getJSONArray("going");
sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_GOING, resultGoing);
}
// sendVoyagesArrayBroadcast
private void sendVoyagesArrayBroadcast(String target, JSONArray resultArray_) {
JSONArray resultArray = new JSONArray();
if (resultArray_.length()>261)
{
for(int i = 0; i < 261; i++) {
try {
resultArray.put(resultArray_.get(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
Log.e("resultArray","");
}
else
resultArray=resultArray_;
Intent intent = new Intent();
intent.setAction(BROADCAST_TAG + target);
intent.putExtra("data", resultArray.toString());
/*if(!target.contains("bus2")){
Log.e("sendSuccessBroadcast",target);
intent.putExtra("data", resultArray.toString());
}*/
context.sendBroadcast(intent);
}
这是由于bundle
,bundle
尺寸限制传递数据。如果要无线传输数据,请使用EventBus
,它可以处理足够的数据传输
使用分页。您可以通过两种方式执行此操作:
- 在您的本地应用中
- 使用网络服务
我建议使用选项 2。如果不是,则为此一次加载 10-20 个项目。