Android 未来的用例是什么?
What is the use case for a Android Future?
就上下文而言,我是一名 Android 开发人员,熟悉使用 AsyncTask,但最近开始从事大量使用 Future 的项目。期货没有回调,需要检查 isDone()
以确定进度。
我无法理解 Future 在 Android 中的用途和用例。 AsyncTask 提供了看似相同的功能,但在我看来有一个更好的接口,它内置了回调,使客户端能够清楚地确定异步操作何时完成,而无需不断检查 isDone()
.
Android 中 Future 的用途和目的是什么,为什么我要使用 Future 或 FutureTask 而不是 AsyncTask?
Future
is part of the Java API, whereas the AsyncTask
is Android specific. In fact, if you take a look at the 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
只是短线程作业的助手 class,它还可以处理一些 thread pooling。我的猜测是您的项目的原始作者熟悉 Future
,但不熟悉 AsyncTask
,或者通常不喜欢 AsyncTask
。
因为我不喜欢原来的 AsyncTask
实现,因为它的 Exception
处理,我继续寻找更好的替代方案,并找到了 RoboGuice's SafeAsyncTask。在此实现中,onException(Exception)
回调可用,但 RuntimeException
也会传播到该回调。
我认为 NullPointerException
应该会使应用程序崩溃,我不久前修改了这个 SafeAsyncTask
来做到这一点。结果可以查到here.
就上下文而言,我是一名 Android 开发人员,熟悉使用 AsyncTask,但最近开始从事大量使用 Future 的项目。期货没有回调,需要检查 isDone()
以确定进度。
我无法理解 Future 在 Android 中的用途和用例。 AsyncTask 提供了看似相同的功能,但在我看来有一个更好的接口,它内置了回调,使客户端能够清楚地确定异步操作何时完成,而无需不断检查 isDone()
.
Android 中 Future 的用途和目的是什么,为什么我要使用 Future 或 FutureTask 而不是 AsyncTask?
Future
is part of the Java API, whereas the AsyncTask
is Android specific. In fact, if you take a look at the 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
只是短线程作业的助手 class,它还可以处理一些 thread pooling。我的猜测是您的项目的原始作者熟悉 Future
,但不熟悉 AsyncTask
,或者通常不喜欢 AsyncTask
。
因为我不喜欢原来的 AsyncTask
实现,因为它的 Exception
处理,我继续寻找更好的替代方案,并找到了 RoboGuice's SafeAsyncTask。在此实现中,onException(Exception)
回调可用,但 RuntimeException
也会传播到该回调。
我认为 NullPointerException
应该会使应用程序崩溃,我不久前修改了这个 SafeAsyncTask
来做到这一点。结果可以查到here.