java - Runnable 中的 AsyncHttpClient

标签 java android handler runnable asynchttpclient

在我的应用程序中,我需要实现某种聊天。但是我没有使用 longpoll 连接,而是每 5 秒向服务器发送一次 get 请求。聊天不是我应用程序的主要功能。 我正在使用 Handler 发布一个 Runnable,在 run 方法中我正在使用 AsyncHttpClient。 这是代码:

chatHandler = new Handler();
    chatRunnable = new Runnable() {
        @Override
        public void run() {
            final int pos = adapter.getCount();
            AsyncHttpClient client = new AsyncHttpClient();
            client.addHeader("X-Auth-token", User.getInstance(getApplicationContext()).getToken());
            client.addHeader("clienttype", "android");
            try {
                client.addHeader("clientvesrion", (getPackageManager().getPackageInfo(getPackageName(), 0)).versionName);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }

            RequestParams params = new RequestParams();
            params.add("todo_id", todo.getServerId() + "");
            params.add("from_id", messages.size() == 0 ? "0" : messages.get(messages.size() - 1).getId() + "");
            client.setTimeout(5000);

            client.get(getApplicationContext(), getString(R.string.server_path) + getString(R.string.path_messages_from_id), params, new AsyncHttpResponseHandler(){
                      ...
            });
        }
    };
    chatHandler.postDelayed(chatRunnable, 5000);

但是,有时这会在 client.get() 处崩溃并出现以下错误:

FATAL EXCEPTION: main
java.lang.OutOfMemoryError: thread creation failed
        at java.lang.VMThread.create(Native Method)
        at java.lang.Thread.start(Thread.java:1050)
        at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:913)
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1295)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:81)
        at com.loopj.android.http.AsyncHttpClient.sendRequest(AsyncHttpClient.java:893)
        at com.loopj.android.http.AsyncHttpClient.get(AsyncHttpClient.java:612)
        at ru.dotcapital.controlmanager.ChatActivity$1.run(ChatActivity.java:115)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:5365)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
        at dalvik.system.NativeStart.main(Native Method)

谷歌的一些引用说,当你有很多 Activity 正在运行但没有完成,并且有很多 AsyncTasks 一次运行,但我的 ChatActivity 是第三个 Activity 时,它就会发生。用户会调用我出现错误时没有及时运行的 AsyncTasks。 有什么建议吗?

最佳答案

我无法从这段代码中看到更广泛的上下文,但根据你的问题,你说你每 5 秒做一次事情,即使你没有互联网,你是否也可能在做这个例程?我也没有看到您使用 close() 关闭客户端方法。不调用 close() 即使没有响应也不会释放资源,连续调用只会填满内存。

关于java - Runnable 中的 AsyncHttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26859896/

相关文章:

android - 计费 API v3 IabHelper NullPointerException

android - 如何将按钮添加到悬卡在上方的底部导航栏 - Flutter

Android Studio - 如何从 fragment 中停止 handler.postDelayed?

Python 日志记录不会创建日志文件的多个实例

java - Tomcat session 调度程序存在

java - 在与父 Activity 不同的进程中完成子 Activity 。 finishActivity() 不起作用

java - 新部署后如何清理缓存?

java - 错误响应时的 jaxws 处理程序行为

java - Selector.close() 是否关闭所有客户端套接字?

java - 如何查询邮箱账号是否有效?