void run()

in firebase-storage/src/main/java/com/google/firebase/storage/FileDownloadTask.java [184:261]


  /*package*/ void run() {
    if (mException != null) {
      tryChangeState(INTERNAL_STATE_FAILURE, false);
      return;
    }

    if (!tryChangeState(INTERNAL_STATE_IN_PROGRESS, false)) {
      return;
    }

    do {
      mBytesDownloaded = 0;
      mException = null;
      mSender.reset();
      final NetworkRequest request =
          new GetNetworkRequest(
              mStorageRef.getStorageReferenceUri(), mStorageRef.getApp(), mResumeOffset);

      mSender.sendWithExponentialBackoff(request, false);
      mResultCode = request.getResultCode();
      mException = request.getException() != null ? request.getException() : mException;

      boolean success =
          isValidHttpResponseCode(mResultCode)
              && mException == null
              && getInternalState() == INTERNAL_STATE_IN_PROGRESS;

      if (success) {
        mTotalBytes = request.getResultingContentLength() + mResumeOffset;
        String newEtag = request.getResultString("ETag");
        if (!TextUtils.isEmpty(newEtag)
            && mETagVerification != null
            && !mETagVerification.equals(newEtag)) {
          Log.w(TAG, "The file at the server has changed.  Restarting from the beginning.");
          mResumeOffset = 0;
          mETagVerification = null;
          request.performRequestEnd();
          schedule(); // reschedule
          return;
        }

        mETagVerification = newEtag;

        try {
          success = processResponse(request);
        } catch (IOException e) {
          Log.e(TAG, "Exception occurred during file write.  Aborting.", e);
          mException = e;
        }
      }

      request.performRequestEnd();
      success = success && mException == null && getInternalState() == INTERNAL_STATE_IN_PROGRESS;

      if (success) {
        tryChangeState(INTERNAL_STATE_SUCCESS, false);
        return;
      } else {
        File outputFile = new File(mDestinationFile.getPath());
        if (outputFile.exists()) {
          mResumeOffset = outputFile.length();
        } else {
          mResumeOffset = 0; // start over.
        }
        if (getInternalState() == INTERNAL_STATE_PAUSING) {
          tryChangeState(INTERNAL_STATE_PAUSED, false);
          return;
        } else if (getInternalState() == INTERNAL_STATE_CANCELING) {
          if (!tryChangeState(INTERNAL_STATE_CANCELED, false)) {
            Log.w(TAG, "Unable to change download task to final state from " + getInternalState());
          }
          return;
        }
      }
    } while (mBytesDownloaded > 0);

    tryChangeState(INTERNAL_STATE_FAILURE, false);
  }