2017-12-05 4 views
0

은 내가 통근 API를 나는 나를미래와 비 동기화

... 
for (Layer layer : layers) { 

// ListenableFuture extends Future<V> 
final ListenableFuture<FeatureQueryResult> future= gdbFeatureTable.queryFeaturesAsync(query); 

future.addDoneListener(() -> { 
       try { 
        FeatureQueryResult result = future.get(); 
... 
} 

또는

try { 
       FeatureQueryResult result = future.get(); 


    } 
    ... 

미래 클래스를 반환하는 루프는 모든 실행 가능이 (안드로이드에 대한 ESRI의 API)를 사용 queryFeaturesAsync 및 전역 결과 (result1 + result2 + 등 ..) 비동기 적으로 후 루프? 가장 좋은 방법은 무엇입니까? 약속 해? ThreadPoolExecutor? 당신의 도움에 대한

덕분에

답변

1

나는 방법 queryFeaturesAsync() 내부에 이미 ThreadPoolService를 사용하여 생각하고, 과잉 또 다른 ThreadPoolService에서 결과를 retreive하는 이럴을 ThreadPoolService를 사용하여.

나는 네이티브 안드로이드 SDK 도구이며 매우 간단 becuse 사용할 AsyncTask를 사용하는 권 해드립니다 것이다 :

AsyncTask<ListenableFuture<FeatureQueryResult>, Integer, List<FeatureQueryResult>> task = 
     new AsyncTask<ListenableFuture<FeatureQueryResult>, Integer, List<FeatureQueryResult>>() { 
    @Override 
    protected List<FeatureQueryResult> doInBackground(ListenableFuture<FeatureQueryResult>[] futures) { 
     int counter = 0; 
     List<FeatureQueryResult> results = new ArrayList<>(); 
     for (ListenableFuture<FeatureQueryResult> future : futures) { 
      try { 
       results.add(future.get()); 
       publishProgress(++counter); // Optional feature 
      } catch (ExecutionException | InterruptedException e) { 
       Log.w("Huh?", "Interrupted!"); 
      } 
     } 
     return results; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     notifyMainThreadAboutProgress(values[0]); // Optional feature 
    } 

    @Override 
    protected void onPostExecute(List<FeatureQueryResult> featureQueryResults) { 
     doSomethingWithResultsInMainThread(featureQueryResults); 
    } 
}; 

ListenableFuture<FeatureQueryResult> future1 = gdbFeatureTable.queryFeaturesAsync(query); 
ListenableFuture<FeatureQueryResult> future2 = gdbFeatureTable.queryFeaturesAsync(another_query); 
ListenableFuture<FeatureQueryResult> future3 = gdbFeatureTable.queryFeaturesAsync(yet_another_query); 

task.execute(future1, future2, future3); 

내가 예를 단축에 대한 익명의 클래스로 AsyncTask했다. 프로덕션 환경에서는 정적 클래스 여야합니다.

+0

OK 덕분에 나는 그 identifyTask.execute로 확인 – lg0173

+0

을 시도 할거야 (futures.toArray (새 ListenableFuture [futures.size()])); – lg0173

+0

내가 CompletableFuture와 함께 작업 할 수도 있습니다 당신은 어떻게 생각하십니까? – lg0173

0

CompletableFuture를 사용하는 것이 가장 좋습니다. 나는 모든 것을 이해하지 못하는 ...

List<CompletableFuture<FeatureQueryResult>> futures = new ArrayList<>();     
for (Layer layer : layers) { 
    FeatureTable gdbFeatureTable = ((FeatureLayer) layer).getFeatureTable(); 
    CompletableFuture<FeatureQueryResult> completableFuture = new CompletableFuture<>(); 
    ListenableFuture<FeatureQueryResult> future = gdbFeatureTable.queryFeaturesAsync(query); 
    future.addDoneListener(() -> { 
         FeatureQueryResult result = future.get(); 
         completableFuture.complete(result); 
    } 
    futures.add(future); 
} 
CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])); 

당신은이 completablefuture 또 다른 해결책이 있습니까? 당신의 reponse에 대한

감사

+0

죄송합니다. 이전에 'CompletableFuture'를 사용한 적이 없으므로 도움을받을 수 없습니다. 당신의 본보기는 그 목적에 너무 복잡해 보입니다. 내 생각에, 당신은'미래'유형에 집착해서는 안됩니다. 그것은 한 스레드에서 다른 스레드로 결과를 전달하는 방법 일뿐입니다. 여러 가지 비동기 작업을 함께 동기화하는 방법에는 여러 가지가 있습니다. 예를 들어'CountDownLatch'를 사용할 수도 있습니다. – fishbone