2015-02-10 59 views
1

对于上下文,我是一位熟悉使用AsyncTask的Android开发人员,但最近开始着手开发大量使用Future的项目。期货没有回调,需要在isDone()上进行检查以确定进度。Android Future的用例是什么?

我无法理解Android中Future的用途和用例。 AsyncTask提供了看起来像是相同的功能,但在我看来有一个更好的接口,它内置了回调函数,使客户端能够清楚地确定异步操作何时完成,而无需经常检查isDone()

Android中未来的用途和目的是什么?为什么我会在AsyncTask上使用Future或FutureTask?

回答

2

Future是Java API的一部分,而AsyncTask是Android专用的。事实上,如果你看看在source code of AsyncTask,你会看到,它实际上采用的是FutureTask及其实施:

/** 
* Creates a new asynchronous task. This constructor must be invoked on the UI thread. 
*/ 
public AsyncTask() { 
    mWorker = new WorkerRunnable<Params, Result>() { 
     public Result call() throws Exception { 
      mTaskInvoked.set(true); 

      Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 
      //noinspection unchecked 
      return postResult(doInBackground(mParams)); 
     } 
    }; 

    mFuture = new FutureTask<Result>(mWorker) { 
     @Override 
     protected void done() { 
      try { 
       postResultIfNotInvoked(get()); 
      } catch (InterruptedException e) { 
       android.util.Log.w(LOG_TAG, e); 
      } catch (ExecutionException e) { 
       throw new RuntimeException("An error occured while executing doInBackground()", 
         e.getCause()); 
      } catch (CancellationException e) { 
       postResultIfNotInvoked(null); 
      } 
     } 
    }; 
} 

AsyncTask因此只是短期穿线工作一个辅助类,这也处理一些thread pooling 。我的猜测是,您项目的原创作者熟悉Future s,但不熟悉AsyncTask,或者通常不喜欢AsyncTask


因为我不喜欢原来的AsyncTask实施,由于其Exception处理,我去了一个更好的选择进行搜索,并发现RoboGuice's SafeAsyncTask。在此实现中,回调函数onException(Exception)可用,但RuntimeException也会传播到该回调函数。

我认为一个NullPointerException应该会让应用程序崩溃,并且我稍微修改了这个SafeAsyncTask来做这件事。结果可以找到here

+0

谢谢,我怀疑你提到的情况或他们试图“模拟”同步行为。知道Async正在使用FutureTask并且我还没有意识到AsyncTask的异常处理问题。 – stevebot 2015-02-10 17:10:48