我正在使用离线同步功能的azure android上工作。我必须同步多个表。目前我正在这样做,如下所示。对于我调用pull方法的每个表,目前我看到的是每个表都被一个接一个地拉。我想以异步的方式来做这件事,我还需要等待所有表同步。
public void syncAsync(){
if (isNetworkAvailable()) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
mItemsTable.pull(mPullQuery_Items).get();
mCustomerTable.pull(mPullQuery_Customer).get();
mSalesTable.pull(mPullQuery_Sales).get();
//Few more tables to pull.
} catch (Exception exception) {
exception.printStackTrace();
}
finally {
}
return null;
}
}.execute();
} else {
//error
}
}
我看到微软使用ListneableFuture,并试图从中读取一些信息
此链接
我在链接中看到了这个代码示例
列表>查询;//查询将转到所有不同的数据中心,但我们希望等到它们全部完成或失败
ListenableFuture<List<QueryResult>> successfulQueries = Futures.successfulAsList(queries);
Futures.addCallback(successfulQueries, callbackOnSuccessfulQueries);
我正试图像上面那样更改我的代码,但我不明白如何做到这一点。我想等到它们都完成了(所有的表都拉出来),需要一个成功或失败的列表。由于我是Java初学者,我发现如何修改有点难理解。
@Nasir函数successfulAsList
中给定的参数是ListenableFuture类型varargs或包含ListableFuture型值的列表,请参阅http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/Futures.html#successfulAsList(com.google.common.util.concurrent.ListnableFuture…).
因此,您需要将进程mXxxTable.pull().get()
封装为一个对象,将接口Callable
实现为接口ListeningExecutorService
的函数submit
的参数,以获得其中一个varargs(或列表)的ListenableFuture
对象,从而获得successfulAsList。
下面有一个测试演示作为参考。还有博客http://codingjunkie.net/google-guava-futures/解释更多细节。
public void should_test_furture() throws Exception {
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture future1 = service.submit(new Callable<Integer>() {
public Integer call() throws InterruptedException {
Thread.sleep(1000);
System.out.println("call future 1.");
return 1;
}
});
ListenableFuture future2 = service.submit(new Callable<Integer>() {
public Integer call() throws InterruptedException {
Thread.sleep(1000);
System.out.println("call future 2.");
// throw new RuntimeException("----call future 2.");
return 2;
}
});
final ListenableFuture allFutures = Futures.successfulAsList(future1, future2);
final ListenableFuture transform = Futures.transform(allFutures, new AsyncFunction<List<Integer>, Boolean>() {
@Override
public ListenableFuture apply(List<Integer> results) throws Exception {
return Futures.immediateFuture(String.format("success future:%d", results.size()));
}
});
Futures.addCallback(transform, new FutureCallback<Object>() {
public void onSuccess(Object result) {
System.out.println(result.getClass());
System.out.printf("success with: %s%n", result);
}
public void onFailure(Throwable thrown) {
System.out.printf("onFailure%s%n", thrown.getMessage());
}
});
System.out.println(transform.get());
}