Как получить статус из Задачи <Void>, возвращенной методами ConnectionsClient? - PullRequest
0 голосов
/ 25 сентября 2019

Я использую ConnectionsClient API , включая startAdvertising(), который возвращает Task<Void>.Javadoc для startAdvertising() включает в себя следующее утверждение:

Возможные коды состояния результата включают в себя:

  • STATUS_OK, если реклама началась успешно.
  • STATUS_ALREADY_ADVERTISING, если приложение уже рекламирует.
  • STATUS_OUT_OF_ORDER_API_CALL, если приложение в настоящее время подключено к удаленным конечным точкам;Сначала вызовите stopAllEndpoints ().

Как получить эти значения состояния после вызова startAdvertising()?

Я знаю, что API-интерфейс Task позволяет мне создавать OnSuccessListener и OnFailureListener, но я хочу иметь возможность различать различные случаи сбоев (в частности, STATUS_ALREADY_ADVERTISING - доброкачественная ошибка).Поскольку типом является Task<Void>, вызов getResult() при его передаче методу onSuccess() не дает полезной информации.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Все коды состояния находятся в ConnectionsStatusCodes классе.В методе startAdvertising третьим параметром является ConnectionLifecycleCallback , который можно использовать для получения этих кодов состояния.Например:

final Activity activity = this;
final ConnectionLifecycleCallback callback = new ConnectionLifecycleCallback() {
    @Override
    public void onConnectionInitiated(String endpointId, ConnectionInfo connectionInfo) {

    }

    @Override
    public void onConnectionResult(String endpointId, ConnectionResolution resolution) {
        int statusCode = resolution.getStatus().getStatusCode();
        switch (statusCode) {
            case ConnectionsStatusCodes.STATUS_OK:
                break;
            case ConnectionsStatusCodes.STATUS_ALREADY_ADVERTISING:
                break;
            case ConnectionsStatusCodes.STATUS_OUT_OF_ORDER_API_CALL:
                break;  
        }
    }

    @Override
    public void onDisconnected(String endpointId) {

    }
};

Nearby.getConnectionsClient(activity).startAdvertising("name", "serviceId", callback, new AdvertisingOptions.Builder().build());
1 голос
/ 26 сентября 2019

Вот вспомогательный метод для преобразования Задачи в код состояния.Этот пример метода является блокирующим, но для асинхронного он будет выглядеть аналогично.Try / catch привязывается непосредственно к OnSuccessListener / OnFailureListener.

import static com.google.android.gms.common.api.CommonStatusCodes.ERROR;
import static com.google.android.gms.common.api.CommonStatusCodes.SUCCESS;

import android.support.annotation.CheckResult;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.Tasks;
import java.util.concurrent.ExecutionException;

@CheckResult
public static int waitForTask(String methodName, Task<?> task) {
  try {
    Tasks.await(task);
    return SUCCESS;
  } catch (InterruptedException | ExecutionException e) {    
    if (e instanceof InterruptedException) {
      Thread.currentThread().interrupt();
    }

    Exception taskException = task.getException();
    if (taskException instanceof ApiException) {
      return ((ApiException) taskException).getStatusCode();
    }

    return ERROR;
  }
}
...