【问题标题】:catch asynctask ANR捕获异步任务 ANR
【发布时间】:2012-07-02 13:44:09
【问题描述】:

如果通过 2g 网络同时下载,我的 downloadFile AsyncTask 可能需要相当长的时间。我怀疑它被杀死了,但我不确定。

我的问题是:asynctask 的超时时间是多少?当 android 杀死我的任务时会调用什么函数?如果抛出异常,在哪里捕获它?

【问题讨论】:

  • 我认为没有超时之类的东西。但是有像“线程池”这样的东西,所以线程池中的线程可以被杀死。你应该阅读这个ThreadPoolExecutor
  • AsyncTask 耗时的真正问题是,如果 Activity(AsyncTask 启动的地方)被销毁,而你让 AsyncTask 继续运行,它将变得无法访问并导致内存泄漏,并导致各种 Exception结果。

标签: android timeout android-asynctask


【解决方案1】:

Android 不应终止您的任务。 AsyncTask 就是这样,异步的,所以 Android 不会为它抛出 ANR。

如果您想在 doInBackground 中测试异常,请将您的代码包装在相关的 try catch 块中,然后在出现异常时抛出或处理异常。

您可以取消 AsyncTask,但您必须在任务中每隔一段时间检查 isCancelled 标志。

取消任务后,onPostExecute() 将不会被调用。

当然可以在这里进一步阅读:http://developer.android.com/reference/android/os/AsyncTask.html

补充: 请注意,也许重要的是,Android Ice Cream Sandwich 和 Honeycomb 不再将线程池执行作为默认值,而是使用序列化方法。如果您在 ICS 上发现您的任务似乎永远不会被执行,或者在很长一段时间后执行,您应该使用executeOnExecutor() 执行并将THREAD_POOL_EXECUTOR 参数传递给它。更多信息可在上面的链接中找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多