在我的Android程序中,我必须进行4或5次网络通话。每个都是独立的,每个都可以独立运行。
public void backGroundTasks() {
new AsyncTasks<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
List<User> users = RetrofitAdapter.getClient().getUsersSync();
saveToDB(users);
} catch (RetrofitError error) {
error.printStackTrace();
}
return null;
}
}.execute();
new AsyncTasks<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
List<Media> contents = RetrofitAdapter.getClient().getContentsSync();
saveToDB(contents);
} catch (RetrofitError error) {
error.printStackTrace();
}
return null;
}
}.execute();
new AsyncTasks<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Profile profile = RetrofitAdapter.getClient().getProfile();
saveToDB(profile);
} catch (RetrofitError error) {
error.printStackTrace();
}
return null;
}
}.execute();
new AsyncTasks<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
List<Message> messages = RetrofitAdapter.getClient().getMessages();
saveToDB(messages);
} catch (RetrofitError error) {
error.printStackTrace();
}
return null;
}
}.execute();
}
我的问题是,
这AsyncTask
如何运作?
将以并行执行?或将被调用,但 网络请求 将排队?
在他们提到的一些SO答案中,他们使用AsyncTasks
执行executeOnExecutor()
。这种情况会有所帮助吗?
注意: 我使用Retrofit库来简化REST调用。它有什么问题吗?
答案 0 :(得分:1)
这个AsyncTask如何工作?将并行执行吗?
由于蜂窝状它们将按顺序执行,但如果你将使用executeOnExecutor,那么它们将被并行执行。
或将被调用,但网络请求将排队?
它们将排队,没有网络操作将启动,直到AsyncTask将轮到它。
内部AsyncTasks使用Executors。您的任务仅执行网络操作,因此您可以切换到执行程序。如果您想以串行方式进行网络操作,那么您也可以考虑使用IntentService。
答案 1 :(得分:1)
这是 Arhimed 的答案。他解释得很好。
AsyncTask使用线程池模式来运行doInBackground()中的东西。问题最初(在早期的Android OS版本中)池大小只有1,这意味着没有对一堆AsyncTasks进行并行计算。但后来他们修复了这个问题,现在大小为5,所以最多可以同时运行5个AsyncTasks。不幸的是,我不记得他们究竟改变了什么版本。
要查看他的answer
答案 2 :(得分:1)
Executors
的 AsyncTasks
就像魅力一样。它同时执行网络请求。
来自文档,
自Honeycomb以来,调用AsyncTask的
executeOnExecutor()
代替execute()
将并行执行任务。AsyncTask.THREAD_POOL_EXECUTOR
可用于并行执行任务的执行程序。