1

私のアプリでは、ある種のチャットを実装する必要があります。しかし、longpoll 接続を使用する代わりに、get5 秒ごとにサーバーにリクエストを送信するだけです。チャットはアプリの主要な機能ではありません。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)

Google の一部の参考文献では、多くのアクティビティが実行されていて終了していない場合、および一度に多くの AsyncTasks が実行されている場合に発生すると言われていますが、私ChatActivityは 3 番目のアクティビティです。助言がありますか?

4

1 に答える 1

1

このコードからより広範なコンテキストを確認することはできませんが、5 秒ごとに何かを行っているとの質問に基づいて、インターネットがない場合でもこのルーチンを実行している可能性はありますか? また、 close()メソッドを使用してクライアントを閉じていることもわかりません。呼び出しをclose()行わなくても、応答がなくてもリソースが解放されるわけではなく、呼び出しを続けるとメモリがいっぱいになるだけです。

于 2014-11-11T08:45:08.157 に答える