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

标签 java android facebook facebook-graph-api callback

我有一个应用程序可以解析用户的 facebook 消息,由于 facebook API 的一个极其烦人的限制,每次 API 调用只能接收 25 条消息,我必须使用一些奇怪的准递归方法来解析消息,以便我可以处理分页。当我尝试在重试之前超出请求的情况下让应用程序 hibernate 时,出现了问题。

我注意到该应用程序运行速度非常快,每秒解析多个 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 条消息之后,速度变慢确实会扼杀应用程序的生存能力,并且每次对话可能有数十万条消息,我无法合理地继续前进。

最佳答案

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

在您的Activity中创建一个Handler:

Handler handler = new Handler();

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

handler.postDelayed(new Runnable() {

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

Handler 在当前线程上安排您的任务。

查看文档: Handler | Android Developers

关于java - Android 应用程序在多次回调后变得缓慢 - 这里出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31173650/

相关文章:

android - RealmBaseAdapter 是否已从 realm-java 中删除?

ios - UINavigationController 的自定义 UIBarButtonItem/UISegmentedControl

android - 在 Facebook 集成上发布多张图片

java - 如何使用 OpenCV 的 Watershed Transform 实现过分割?

java - 找不到方法 com.google.android.gms.common.GooglePlayServicesUtil

java - 无法在 SWIG 包装器中公开私有(private)基类成员函数

android - Kotlin init block 没有执行

android - 如何强制 Android 浏览器在放大/缩小时不改变视口(viewport)的宽度?

java - JXTA 客户-服务器

facebook - 为什么 facebook api 在授权用户登录 facebook 时询问此消息 - "Application name"想访问您的 friend 列表。?