2017-10-16 1 views
0

と別のクラスでは、私はボルトタスクフレームワークに関するドキュメントを理解する問題が生じています。複雑なタスクを書く必要がある複雑なAndroidプロジェクトでこれを大いに活用しています。どのように私はので、私は、タスクの結果を設定することができTaskCompletionSourceと一緒にこれを達成することができますか? バックグラウンドで実行されるコードはどこに置くのですか?私が使用していたタスクの例のアンドロイドボルトタスク:複雑なタスクTaskCompletionSource

ワンドラフト:

public class CheckInternetConnectionTask { 
    private static final String TAG     = "CheckInternetConnReq"; 
    private static  Date mLastCheckDate  = null; 
    private static  Boolean mLastConnectionStatus = null; 
    private static  int  mConnectionAttempts = 0; 

    private Context mContext; 

    public CheckInternetConnectionTask(Context context) { 
     this.mContext = context; 
    } 

    public void resetConnectionStatus() { 
     mLastCheckDate = null; 
     mLastConnectionStatus = null; 
     mConnectionAttempts = 0; 
    } 

    public Task<Boolean> getTask() { 
     return Task.callInBackground(new Callable<Boolean>() { 
      @Override 
      public Boolean call() throws Exception { 
       Log.i(TAG, "Checking for internet connection..."); 
       Calendar calendar = Calendar.getInstance(); 

       Date currentDate = calendar.getTime(); 

       if (mLastCheckDate == null) { 
        mLastCheckDate = calendar.getTime(); 
       } 

       if (mLastConnectionStatus != null && getDifferenceInSeconds(currentDate, mLastCheckDate) < 5) { 
        Log.i(TAG, "Last checked < 5 seconds, returning previous value: " + mLastConnectionStatus); 
        if (mConnectionAttempts < 10) { 
         mConnectionAttempts ++; 

         return mLastConnectionStatus; 
        } 

        Log.i(TAG, "Resetting connection check attempt counter to 0, checking for internet connection..."); 
        mConnectionAttempts = 0; 
       } 

       ConnectionDetector connectionDetector = new ConnectionDetector(mContext); 

       mLastCheckDate = currentDate; 
       mLastConnectionStatus = connectionDetector.isConnected(); 

       return mLastConnectionStatus; 
      } 
     }); 
    } 

    private long getDifferenceInSeconds(Date currentDate, Date savedDate) { 
     long diffInMillisec = currentDate.getTime() - savedDate.getTime(); 

     return TimeUnit.MILLISECONDS.toSeconds(diffInMillisec) % 60; 
    } 
} 

上記のクラスは、私のコードで使用されていると仮定すると、コールは次のとおりです。

final CheckInternetConnectionTask checkConectionTask = new CheckInternetConnectionTask(this); 
checkConectionTask.getTask().onSuccess(new Continuation<Boolean, Object>() { 
    @Override 
    public Object then(Task<Boolean> task) throws Exception { 
     // This can never be used: 
     if (task.isFaulted()) { 
      // TODO: Notify user that something went wrong 
     } else {   
      mCardNoConnection.setVisibility(task.getResult() ? View.GONE : View.VISIBLE); 
     } 
     return null; 
    } 
}, Task.UI_THREAD_EXECUTOR); 

このように、定義された完了源がないので、私はtask.getError()メソッドにアクセスするための方法はありません。 自分のクラスに複雑なオブジェクトがある場合、このフレームワークを適切に使用するにはどうすればよいですか?

別のオプションは完全にTaskCompletionSourceオブジェクトを回避し、カスタムのisErrorと例外のプロパティと一緒にタスクの結果が含まれていますカスタムタスクの状態オブジェクトのいくつかの種類を返すことです。しかしこれは、TaskCompletionSourceを使うほど優雅ではありません。それはあなたが経験している問題のように思える

答えて

1

あなたは#onSuccess(Continuation)代わりの#continueWith(Continuation)を使用していることです。 onSuccessContinuationは、ソースタスクが正常に解決された場合にのみ呼び出されます。 continueWithに変更すると、ソースタスクが成功、失敗、またはキャンセルに解決されたときにContinuationが呼び出されます。

+1

あなたは正しいです、ありがとう! –