Android “创建异步任务的模式”;“程序性”;

Android “创建异步任务的模式”;“程序性”;,android,android-asynctask,Android,Android Asynctask,我在很多地方使用AsyncTask都没有问题 现在有了蜂巢,所有的网络i/o都需要在与UI线程分开的线程中,在很多情况下,UI线程需要异步任务,在同步网络连接之前,异步任务是非常合适的(蜂巢将对主/UI线程上的任何网络i/o抛出异常) 现在我基本上想得到类似于objectresult=MyAsyncTask().execute()有好的模式吗 我发现这是有道理的,也是GWT做事的方式,但不知何故,这听起来像是在摆弄狗的尾巴(可能只是我的大脑需要更多的扭曲)。我肯定你不想在UI线程上执行同步网络事

我在很多地方使用AsyncTask都没有问题

现在有了蜂巢,所有的网络i/o都需要在与UI线程分开的线程中,在很多情况下,UI线程需要异步任务,在同步网络连接之前,异步任务是非常合适的(蜂巢将对主/UI线程上的任何网络i/o抛出异常)

现在我基本上想得到类似于
objectresult=MyAsyncTask().execute()
有好的模式吗


我发现这是有道理的,也是GWT做事的方式,但不知何故,这听起来像是在摆弄狗的尾巴(可能只是我的大脑需要更多的扭曲)。

我肯定你不想在UI线程上执行同步网络事务,对吗


我使用的模式是保持活动中的状态(它实现了一个接收器),然后调用AsycTask,它在onPostExecute()中对您的活动执行回调(即触发您的活动正在侦听的意图)。然后,您的活动可以根据intent中的extras更新状态,并继续处理。它基本上是一个保存在活动中的状态机,用于执行登录和其他功能。所有的网络I/O都是在AycTebug实例中执行的,这导致状态在它们完成时被更新。

< P>如果您只想阻止线程,而其他线程执行该任务,则可以考虑编写自己的任务抽象。我在想类似的事情

public class MyTask <T>  {
    // define executor here
    public T execute(Callable<T> c) {
        Future<T> t = executor.submit(c);
        return t.get();
    }
 }
公共类MyTask{
//在这里定义执行者
公共T执行(可调用c){
未来t=执行人提交(c);
返回t.get();
}
}

是的。你很接近。试一试

Object result = MyAsyncTask().execute().get();

是的,不在UI线程上。在HC之前,这是可能的(在某些地方,这是有意义的),但是HC会对UI线程上的任何网络调用抛出一个异常。谢谢-这正是我要找的-我怎么会错过第一个呢。对于某些部分来说,GWT模式相当不错,但是在异步TAK完成之前,当需要它时,…get()非常有意义。值得思考的是,对于遇到这个问题的其他人来说,从UI线程调用execute().get()实际上与在UI线程上运行操作相同。虽然这样可以避免在主线程上引发网络调用异常,但也无法避免操作的影响。您的UI线程将阻塞,直到网络操作完成。使用postExecute方法可能会导致死锁,因为该方法将等待主线程可用。IMHO您正在为异步任务提供反模式。