gpt4 book ai didi

java - 如何在android中的azure离线同步中异步同步多个表

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:46 25 4
gpt4 key购买 nike

我正在开发 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
}
}

我看到 Microsoft 使用 ListneableFuture 并尝试从中读取一些信息

This link

我在链接中看到此代码示例

列表>查询;//查询会发送到所有不同的数据中心,但我们希望等到它们全部完成或失败。

ListenableFuture<List<QueryResult>> successfulQueries = Futures.successfulAsList(queries);

Futures.addCallback(successfulQueries, callbackOnSuccessfulQueries);

我正在尝试像上面那样更改我的代码,但我无法理解如何执行此操作。我想等到它们全部完成(所有表都已拉出)并且需要成功或失败的列表。由于我是Java初学者,发现如何修改有点难以理解。

最佳答案

@纳西尔函数 successfulAsList 中给出的参数可以是 ListenableFuture 类型的可变参数,也可以是包含 ListenableFuture 类型值的列表,请参阅 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/Futures.html#successfulAsList(com.google.common.util.concurrent.ListenableFuture...)

因此,您需要将过程mXxxTable.pull().get()包装为一个实现接口(interface)Callable的对象,作为函数submit的参数接口(interface) ListeningExecutorService 来获取 successAsList 的可变参数(或列表)之一的 ListenableFuture 对象。

下面有一个测试演示作为引用。和博客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());
}

关于java - 如何在android中的azure离线同步中异步同步多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com