2017-12-28 10 views
0

in diesen Antworten zu anderen stackoverflow Fragen: https://stackoverflow.com/a/41360829/1932522 und https://stackoverflow.com/a/40557237/1932522 gibt es Beispiele, die zeigen, wie Sie eine TaskCompletionSource verwenden, um verzögerte Aufrufe innerhalb einer Aufgabe ausführen zu können.Getting TaskCompletionSource funktioniert (Android Aufgaben für Firestore)

Wenn dies in einem einfachen Beispiel der Umsetzung (vorausgesetzt, unten), ich in das Problem führen, dass die Linie .continueWith(new TaskerB())); nicht kompiliert werden, da der Compiler eine Aufgabe als erste Parameter erwartet: Incompatible equality constraint: Task<String> and String, würde ich diese Parameter erwartet nur sein sollten der String-Typ? Wer kann helfen, diesen Code zum Laufen zu bringen und mir erklären, wie man erfolgreich Gebrauch macht von TaskCompletionSource.

Hinweis: Das Beispiel ist sehr einfach, in der Praxis würde ich zum Beispiel eine Firestore-Aktion ausführen, einen Listener setzen und die tcs.setResult(..) aus dem Listener aufrufen.

public class StartTask implements Callable<Integer>{ 
     @Override 
     public Integer call() throws Exception { 
      return 1; 
     } 
    } 

    public class TaskerA implements Continuation< Integer, Task<String>>{ 
     @Override 
     public Task<String> then(@NonNull Task<Integer> task) throws Exception { 
      final TaskCompletionSource<String> tcs = new TaskCompletionSource<>(); 
      tcs.setResult("value: " + task.getResult()); 
      return tcs.getTask(); 
     } 
    } 

    public class TaskerB implements Continuation< String, Void>{ 
     @Override 
     public Void then(@NonNull Task<String> task) throws Exception { 
      Log.d(TAG, "Output is: " + task.getResult()); 
      return null; 
     }; 
    } 

    public void runExample(){ 
     Tasks.call(new StartTask()) 
      .continueWith(new TaskerA()) 
      .continueWith(new TaskerB())); 
    } 

Antwort

2

Verwenden continueWithTask statt:

Tasks.call(new StartTask()) 
     .continueWithTask(new TaskerA()) 
     .continueWith(new TaskerB()); 
Verwandte Themen