2015-11-15 51 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()); 
}