如何在安卓系统的azure离线同步中异步同步多个表



我正在使用离线同步功能的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());
}

最新更新