多次回调后Android应用程序变得缓慢 - 这里有什么问题?

时间:2015-07-02 00:09:30

标签: java android facebook facebook-graph-api callback

我有一个应用程序可以解析用户的facebook消息,并且由于facebook API的一个非常恼人的限制,只允许每个API调用接收25个消息,我必须使用一些奇怪的准递归方法来解析消息,所以我可以处理分页。当我尝试让我的应用程序在我们超出请求的情况下再次尝试睡眠时,我的问题出现了。

我注意到应用程序会快速拍摄,每秒解析几次api调用。但是当应用程序被拖动并且请求达到数百个时,它的速度减慢到每5秒钟1次。有人看到什么让我放慢了速度吗?

我的代码的相关部分:

我从服务开始解析,这基本上是对25条消息的初始请求(以及之后每条消息的链接)并调用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条消息,然后检查它是否收到了指向下一页的链接,如果没有,则退出。

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条消息之后,减速确实会破坏应用程序的可行性,并且每次会话可能有数十万条消息,我无法合理地继续这样做。

1 个答案:

答案 0 :(得分:3)

在Android应用中使用Thread.sleep()是禁忌。

Handler

中创建Activity
Handler handler = new Handler();

然后使用它来安排您的方法以后运行:

handler.postDelayed(new Runnable() {

    public void run() {
        retrieveMsgs(next);
    }
}, 240000);

Handler会在当前Thread上安排您的任务。

查看文档: Handler | Android Developers