AsyncTask TimeOut情境解决方案

时间:2013-10-10 06:55:08

标签: android multithreading android-asynctask

我正在使用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中运行它。 这种方法是正确的还是我必须考虑其他方法。

2 个答案:

答案 0 :(得分: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()不会使asynctask asunchronous。 get()等待阻塞ui线程的结果。删除get()并使用例如new TheTask().execute()之类的执行。

还必须在ui线程上调用asynctask

答案 1 :(得分:1)

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

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

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

ps this post给出了一些想法AsyncTask.get(...)可能有意义:基本上说,只有你的AsyncTask正在做一些初始化,这是一种基础的用户界面。

p.p.s :您是否考虑过指定JDBC连接超时?检查实例this site以获取更多详细信息。