2015-11-15 55 views
1

我正在使用azure-android使用离线同步设施。我必须同步多个表。目前我正在做下面的这个。对于每个表我调用pull方法,目前我所看到的是每一个都被逐一拉动。我想以异步的方式做到这一点,我也需要等待所有表同步。如何在Azure脱机同步中同步多个表在异步Android

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并试图从

This link

我的链接看到该代码示例阅读一些信息

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

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

Futures.addCallback(successfulQueries, callbackOnSuccessfulQueries); 

我试图改变像上面我的代码,但我无法理解如何做到这一点。我想等到他们都完成了(所有桌子都拉出来了),并且需要成功或失败的列表。由于我在Java开始时觉得很难理解如何修改。

+0

现在我解决了像这样的异步同步问题,只需调用pull方法而不用获取并保存由pull返回的listenableFuture对象。一旦所有的表都被调用。调用每个可监听的对象。此时它会阻止直到完成拉动。 – Nasir

+0

我仍然不确定是否成功使用AsList。任何人都可以帮助我吗? – Nasir

+0

'successfulAsList'的描述表示“返回一个ListenableFuture,它的值是一个包含每个成功输入期货价值的列表,按照顺序排列。对应于失败或取消期货的值被替换为null。”这似乎就像数据库事务操作一样。 –

回答

0

@Nasir 函数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()了一个对象实现接口Callable为接口ListeningExecutorService的功能submit的参数,以获得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()); 
}