【问题标题】:AsyncTask TimeOut Situation SolutionAsyncTask 超时情况解决方案
【发布时间】:2013-10-10 06:55:08
【问题描述】:

我正在使用asynctask 执行一些任务。 我也想实现在 60 秒内完成,否则会给出超时异常消息。

所以我使用AsyncTask.get(time,timeFormat);

例子:

new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try {
                        validateConnection.execute().get(60, TimeUnit.SECONDS);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    } catch (TimeoutException e) {
                        stopConnTask();
                        invalidCrediantialsError(Utilities.TIMED_OUT_ERROR);
                        e.printStackTrace();
                    }catch(CancellationException e){
                        e.printStackTrace();
                    };
                }
            }).start();

它可以像AsyncTask 一样正常工作。在UI 线程中获取块,所以我在单独的thread 中运行它。 这种方法是否正确,或者我必须考虑其他方法。

【问题讨论】:

  • asynctask 是异步的,除非您调用 get 而不是 execute,否则它不会阻塞 ui 线程
  • 但我同时调用了 validateConnection.execute().get(60, TimeUnit.SECONDS);还是会阻塞
  • 删除 get 它应该可以正常运行
  • asynctask 也必须在 ui 线程上调用

标签: android multithreading android-asynctask


【解决方案1】:
public final Result get ()

Added in API level 3
Waits if necessary for the computation to complete, and then retrieves its result.

Returns
The computed result.
Throws
CancellationException   If the computation was cancelled.
ExecutionException  If the computation threw an exception.
InterruptedException    If the current thread was interrupted while waiting.

调用get() 不会使异步任务异步。 get() 等待结果阻塞 ui 线程。删除 get() 并使用执行,例如 new TheTask().execute()

asynctask 也必须在 ui 线程上调用

【讨论】:

  • 它运行良好,我也不想使用 get,实际上我希望我的异步任务在 60 秒之前完成,否则会发出超时消息。这就是我使用 get 的原因。
  • 其实我正在使用异步任务来检查连接字符串以连接到数据库,天气连接字符串正在返回连接或者它是错误的
  • 你在 asynctask 中做了什么 http 请求?
  • 没有好友,用来检查数据库的连接字符串
  • 检查连接你做什么?您检查 n/w 可用性或互联网连接。
【解决方案2】:

AsyncTask 主要用于长时间运行的任务,这些任务会导致 UI 线程中的 ANR 并将其结果报告给用户界面。

如果您的任务最多运行 60 秒,这意味着您的活动应该同时保持打开状态。你真的想要这个吗?或者您不需要将任何结果应用于 UI?

无论如何,我建议使用内部有线程的服务。您可以从该服务启动一个意图,也可以发送广播以供用户界面进一步处理。

p.s. this post 给出了一些想法,在这种情况下 AsyncTask.get(...) 可能有意义:基本上说,只有当你的 AsyncTask 正在做一些初始化,这是 UI 的一种基础。

p.p.s:您是否考虑过指定 JDBC 连接超时?查看this site 了解更多详情。

【讨论】:

  • 我正在尝试使用异步任务检查 mysql 数据库连接字符串。如果字符串正确,则结果可能会出现一秒钟。但是用户可能会输入所有不正确的凭据,所以总的来说我希望检查应该持续到 60 秒,否则会给出超时异常
  • 任何时候异步任务完成或超时异常来,我都需要为下一步打开一个对话框。
  • @Suresh Bora:如果您确实需要阻止整个 UI,直到您确定数据库连接正常工作,那么get(...) 可能是一个不错的选择。但是,为了在各种环境中实现稳定的网络/数据库操作,我宁愿坚持尝试连接的服务。可能包括一种队列实现。
猜你喜欢
  • 2011-06-15
  • 2011-08-09
  • 2019-11-25
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多