AWS S3 Android SDK 2.11.0
Мой код выглядит так:
final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(s3AccessKeyId, s3SecretAccessKey));
final TransferUtility util = TransferUtility.
builder().s3Client(s3Client).context(context).build();
При обновлении с 'com.amazonaws:aws-android-sdk-s3:2.7.5' до 'com.amazonaws:aws-android-sdk-s3:2.11.0' в моем logcat появляется следующая ошибка, хотя загрузка все еще работает:
E/nsferNetworkLossHandler: TransferNetworkLossHandler is not created. Please call `TransferNetworkLossHandler.getInstance(Context)` to instantiate it before retrieving
E/UploadTask: TransferUtilityException: [com.amazonaws.mobileconnectors.s3.transferutility.TransferUtilityException: TransferNetworkLossHandler is not created. Please call `TransferNetworkLossHandler.getInstance(Context)` to instantiate it before retrieving]
Когда я изменяю свой код, чтобы включить TransferNetworkLossHandler:
TransferNetworkLossHandler.getInstance(context);
final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(s3AccessKeyId, s3SecretAccessKey));
final TransferUtility util = TransferUtility.
builder().s3Client(s3Client).context(context).build();
не делая ничего с этим, я не получаю больше ошибки.
Тем не менее, это не то, как это сообщение об ошибке предназначено. Он говорит вам использовать TransferNetworkLossHandler, но нет документации о том, как его использовать.
Я просто хочу отобразить ошибку (например, Toast или AlertDialog) для пользователя, если загрузка не работает. Так что мне вообще не нужен обработчик. Но я также не хочу, чтобы сообщение об ошибке записывалось в мой журнал каждый раз. Также я не хочу использовать это хакерское решение просто захватить экземпляр и ничего не делать с ним.
Как правильно использовать этот обработчик для моего случая?
2 ответа
Я прочитал release_v2.11.0 и release_v2.11.1 (выпущенные 23 часа назад) CHANGELOGS, и они указывают следующее:
Amazon S3 (улучшения): представлен TransferNetworkLossHandler, утилита, которая прослушивает изменения сетевого подключения. TransferNetworkLossHandler приостанавливает текущие передачи, когда сеть отключается, и возобновляет передачи, которые были приостановлены, когда сеть возвращается в оперативный режим.
Amazon S3 (исправление ошибок): исправлена ошибка в TransferUtility, когда состояние не задано как "WAITING_FOR_NETWORK", когда сеть отключается во время выполнения передач.
В вашем случае вы можете включить TransferNetworkLossHandler, чтобы избежать сообщения об ошибке, и использовать TransferListener, чтобы обнаружить изменение состояния на "WAITING_FOR_NETWORK", "FAILED" или "ERROR" и уведомить пользователя:
TransferObserver transferObserver;
transferObserver = transferUtility.upload(UPLOAD_FOLDER+fileName, fileToUpload);
transferObserver.setTransferListener(new UploadListener());
/**
* Upload listener to check transfer states and progress
*/
private class UploadListener implements TransferListener {
@Override
public void onStateChanged(int id, TransferState state) {
Log.d(TAG, "onStateChanged: " + id + ", " + state.toString());
// If upload error, failed or network disconnect
if(state == TransferState.ERROR || state == TransferState.FAILED || state == TransferState.WAITING_FOR_NETWORK){
// HERE end service and notice user !!!
}
}
@Override public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
float percentDonef = ((float) bytesCurrent / (float) bytesTotal) * 100; int percentDone = (int)percentDonef;
Log.d(TAG, "ID:" + id + " bytesCurrent: " + bytesCurrent + " bytesTotal: " + bytesTotal + " " + percentDone + "%");
}
@Override public void onError(int id, Exception ex) {
Log.e(TAG, ex);
}
}
Вы можете посмотреть по этим ссылкам здесь:
Java https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html
.NET https://docs.aws.amazon.com/AmazonS3/latest/dev/HLuploadFileDotNet.html
Надеюсь, поможет