【问题标题】:Super slow apps caused by large number of unending AsyncTasks大量无休止的 AsyncTask 导致应用程序超慢
【发布时间】:2010-08-11 04:28:46
【问题描述】:

我不知道,但我的应用程序有时会完全停止(对触摸屏幕没有响应)我以为我遵循了线程的所有规则,但我的应用程序显然减慢了 Sprint EVO!我从来没有使用过像我自己的那样慢的应用程序。我没有收到 ANR 对话,但我想我可能应该得到一个。我不知道如何让这个应用程序像我曾经使用过的所有其他应用程序一样运行——不冻结。拥有一个HttpClient 并为所有想要使用它的活动保留对它的静态引用不是一个好主意吗?我以前每次都创建一个新的,并认为将其更改为一个可以加快速度。我的AsyncTasks 都没有结束。如果我第一次去活动 A -> B -> C -> D 会很顺利。我可以按回去,但是当我回到 A 时,它完全冻结了,没有任何反应。当我截取那个截图时。我真的不知道我做错了什么。我应该手动终止 Activity.onPause() 上的 AsyncTasks 吗?

【问题讨论】:

    标签: java android multithreading blocking


    【解决方案1】:

    我不确定您的 Activity 是否冻结...这让我觉得您在 AsyncTask 的 onPreExecuteonPostExecute() 中陷入了无限循环,但谁知道呢。

    不过,我知道,如果您要在多个线程之间共享您的 HttpClient,您应该使用 ThreadSafeClientConnManager

        // Create the client.  We can cache and reuse this client because we're using a
        // ThreadSafeClientConnManager, which will create a pool of connections for us 
        // to use across multiple threads.
        HttpParams params = new BasicHttpParams();
        HttpConnectionParams.setSoTimeout(params, TIMEOUT);
        HttpConnectionParams.setConnectionTimeout(params, TIMEOUT);
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(
                new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
        httpClient = new DefaultHttpClient(cm, params);
    

    【讨论】:

    • 我一直在使用 ThreadSafeClientConnManager,但是我没有设置超时。处理必要操作超时的最佳方法是什么?
    • 我建议设置这些超时参数。这样,如果您达到超时,则 HttpClient 将返回正确的 HttpResponse 和 408 错误代码(客户端超时代码)。
    • 我试过了,但它导致了比以前更多的问题,感谢你的努力,我相信它在某些情况下很有用。
    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多