Android 应用程序在多次回调后变慢 - 这里出了什么问题?
Android application becomes slow after multiple callbacks - what's wrong here?
我有一个应用程序可以解析用户的 facebook 消息,由于 facebook API 的一个非常烦人的限制,每次 API 调用只能接收 25 条消息,我必须使用一些奇怪的准递归方法来解析消息,以便我可以处理分页。当我试图让我的应用程序在超出请求的情况下休眠,然后再次尝试时,我的问题出现了。
我注意到该应用程序的运行速度非常快,每秒解析多个 api 调用。但是随着应用程序的拖延和请求达到数百个,它的速度减慢到大约每 5 秒 1 个请求。有人看到是什么让我慢下来了吗?
我的代码的相关部分:
我从一项服务开始解析,该服务基本上发出 25 条消息的初始请求(然后 link 请求之后的每条消息)并调用 retrieveMsgs()。
@Override
public int onStartCommand(Intent intent, int flags, int startID){
if(intent!=null) {
id = intent.getStringExtra("id");
}
Session session = Session.getActiveSession();
new Request(session, id + "/comments", null, HttpMethod.GET, new Request.Callback() {
@Override
public void onCompleted(Response response) {
try {
JSONArray msgs = response.getGraphObject().getInnerJSONObject().getJSONArray("data");
populateData(msgs);
} catch (JSONException e) {
e.printStackTrace();
}
Request next = response.getRequestForPagedResults(Response.PagingDirection.NEXT);
retrieveMsgs(next);
}
}).executeAsync();
return START_STICKY;
}
这会调用 retrieveMsgs,它将调用自身,直到它完成解析来自 Facebook API 的每 25 条消息数组。它基本上解析了 25 条消息,然后检查它是否收到了下一页的 link,如果没有则退出。
public void retrieveMsgs(final Request next) {
Log.i("api calls", apiCalls+"");
if (next != null) {
next.setCallback(new Request.Callback() {
public void onCompleted(Response response) {
try {
if (response.getGraphObject() == null) {
// we exceeded our limit, sleep for a bit before trying again
try {
Thread.sleep(240000);
}
catch(Exception e){
}
retrieveMsgs(next); // restart the method call
Log.i("hello", "is this slowing us down?");
return;
}
JSONArray msgs = response.getGraphObject().getInnerJSONObject().getJSONArray("data");
populateData(msgs);
Request next2 = response.getRequestForPagedResults(Response.PagingDirection.NEXT);
if (next2 != null) {
apiCalls++;
retrieveMsgs(next2);
} else {
showDoneNotif();
}} catch (JSONException e) {
e.printStackTrace();
}
}
});
next.executeAsync();
}
}
我很难通过内部 类 和回调等等跟踪代码,所以如果有人能解释这里可能出现的问题,我将不胜感激。在 20,000 条左右的消息之后,速度变慢确实会扼杀应用程序的生存能力,并且每次对话可能有数十万条消息,我无法合理地继续前进。
禁止在 Android 应用中使用 Thread.sleep()
。
在您的 Activity
中创建一个 Handler
:
Handler handler = new Handler();
然后用它把你的方法安排到 运行 以后:
handler.postDelayed(new Runnable() {
public void run() {
retrieveMsgs(next);
}
}, 240000);
Handler
将您的任务安排在当前 Thread
。
我有一个应用程序可以解析用户的 facebook 消息,由于 facebook API 的一个非常烦人的限制,每次 API 调用只能接收 25 条消息,我必须使用一些奇怪的准递归方法来解析消息,以便我可以处理分页。当我试图让我的应用程序在超出请求的情况下休眠,然后再次尝试时,我的问题出现了。
我注意到该应用程序的运行速度非常快,每秒解析多个 api 调用。但是随着应用程序的拖延和请求达到数百个,它的速度减慢到大约每 5 秒 1 个请求。有人看到是什么让我慢下来了吗?
我的代码的相关部分:
我从一项服务开始解析,该服务基本上发出 25 条消息的初始请求(然后 link 请求之后的每条消息)并调用 retrieveMsgs()。
@Override
public int onStartCommand(Intent intent, int flags, int startID){
if(intent!=null) {
id = intent.getStringExtra("id");
}
Session session = Session.getActiveSession();
new Request(session, id + "/comments", null, HttpMethod.GET, new Request.Callback() {
@Override
public void onCompleted(Response response) {
try {
JSONArray msgs = response.getGraphObject().getInnerJSONObject().getJSONArray("data");
populateData(msgs);
} catch (JSONException e) {
e.printStackTrace();
}
Request next = response.getRequestForPagedResults(Response.PagingDirection.NEXT);
retrieveMsgs(next);
}
}).executeAsync();
return START_STICKY;
}
这会调用 retrieveMsgs,它将调用自身,直到它完成解析来自 Facebook API 的每 25 条消息数组。它基本上解析了 25 条消息,然后检查它是否收到了下一页的 link,如果没有则退出。
public void retrieveMsgs(final Request next) {
Log.i("api calls", apiCalls+"");
if (next != null) {
next.setCallback(new Request.Callback() {
public void onCompleted(Response response) {
try {
if (response.getGraphObject() == null) {
// we exceeded our limit, sleep for a bit before trying again
try {
Thread.sleep(240000);
}
catch(Exception e){
}
retrieveMsgs(next); // restart the method call
Log.i("hello", "is this slowing us down?");
return;
}
JSONArray msgs = response.getGraphObject().getInnerJSONObject().getJSONArray("data");
populateData(msgs);
Request next2 = response.getRequestForPagedResults(Response.PagingDirection.NEXT);
if (next2 != null) {
apiCalls++;
retrieveMsgs(next2);
} else {
showDoneNotif();
}} catch (JSONException e) {
e.printStackTrace();
}
}
});
next.executeAsync();
}
}
我很难通过内部 类 和回调等等跟踪代码,所以如果有人能解释这里可能出现的问题,我将不胜感激。在 20,000 条左右的消息之后,速度变慢确实会扼杀应用程序的生存能力,并且每次对话可能有数十万条消息,我无法合理地继续前进。
禁止在 Android 应用中使用 Thread.sleep()
。
在您的 Activity
中创建一个 Handler
:
Handler handler = new Handler();
然后用它把你的方法安排到 运行 以后:
handler.postDelayed(new Runnable() {
public void run() {
retrieveMsgs(next);
}
}, 240000);
Handler
将您的任务安排在当前 Thread
。