2016-01-21 10 views
2

Есть ли способ заблокировать текущий поток и ждать, пока изображение будет загружено на S3?Заблокировать поток при загрузке изображения на Amazon S3 на Android

Мой код для загрузки на S3 уже запущен в службе Android в методе doInBackground() (с другими сетевыми вызовами, которые должны быть в определенном порядке), поэтому он отключен от основного потока пользовательского интерфейса. Я просто хочу знать, когда загрузка выполняется, поэтому я могу отклонить уведомление и показать пользователю, что все загружено/сделано.

Я использую SDK v2, как это:

TransferUtility transferUtility = new TransferUtility(s3, ctx); 
TransferObserver obs = transferUtility.upload(
      S3BucketNamePhotoTEST, 
      imageId + ".jpg", 
      file, new ObjectMetadata()); 
obs.setTransferListener(new UploadListener(dbHandler, ctx, imageId)); 

Где UploadListener класс реализации TransferListener, где в методе onStateChanged() мы можем определить, когда загрузка будет завершена:

public void onStateChanged(int id, TransferState state) { 
     if (state == TransferState.COMPLETED) { 
     //do something here! 
     } 
} 

Это не то, что мне нужно, потому что мой служебный вызов будет долгим, когда срабатывает обратный вызов onStateChange().

Но, глядя на SDK v1 (который сейчас в основном устаревшее), есть способ, чтобы заблокировать его, с:

TransferManager tx = new TransferManager(
      credentialProviderChain.getCredentials()); 
Upload myUpload = tx.upload(myBucket, myFile.getName(), myFile); 
... 
// Or you can block the current thread and wait for your transfer to 
// to complete. If the transfer fails, this method will throw an 
// AmazonClientException or AmazonServiceException detailing the reason. 
myUpload.waitForCompletion(); 

Этот waitForCompletion() метод только то, что мне нужно, но не может попасть это с новым API.

Любые решения?

ответ

0

EDIT

Если ваша служба заканчивается, прежде чем вы сможете использовать любые обратные вызовы, то вы должны держать службу открытым, так что это не произойдет. Если вы используете IntentService, они разработаны как функция «огонь и забухание». Вы должны посмотреть на реализацию нормального Service, чтобы вы могли запустить задачу и завершить ее, когда вам нужно через stopSelf().

Заканчивать http://developer.android.com/guide/components/services.html#ExtendingService

Это даст вам больший контроль, когда служба останавливается. Вы можете остановить службу, когда загрузка завершена.

Или, если вы хотите «взломать» его, вы можете добавить логическую переменную-член и заблокировать выполнение с помощью цикла, который будет опросить логическое значение до тех пор, пока оно не будет истинным. Вы можете установить его в True в методе UploadListener, и это должно заставить службу оставаться открытым.

boolean mUploadComplete = false; 

// Start upload. 

Затем после obs.setTransferListener(new UploadListener(dbHandler, ctx, imageid));

do { 
    Thread.sleep(1000); 
} while (!mUploadComplete); 

В:

public void onStateChanged(int id, TransferState state) { 
    if (state == TransferState.COMPLETED) { 
     mUploadComplete = true; 
    } 
} 

//////////////////////// /////// ** Предыдущий пересмотр ниже **

This похоже, что он решит вашу проблему.

UploadResult waitForUploadResult() 
         throws AmazonClientException, 
            AmazonServiceException, 
            InterruptedException 

Ждет эту загрузку для завершения и возвращает результат этой загрузки. Это блокирующий вызов.Будьте готовы обрабатывать ошибки при вызове этого метода. Любые ошибки, возникшие во время асинхронной передачи, будут повторно выбрасываться с помощью этого метода.

так называют:

UploadResult myResult = myUpload.waitForUploadResult(); 

Это должно блокировать поток до загрузки не будет закончена.

+0

Извините Эндрю, но это не отвечает на мой вопрос. Мне нужно заблокировать поток, из которого я вызываю функцию upload transferUtility. Этот код не решает этого. – Beemo

+0

Но код для загрузки уже отключен от потока пользовательского интерфейса (в потоке службы), поэтому нет никаких проблем с его блокировкой. Я сохраняю логику синхронизации в этой службе (а не только фотографии, все виды других приложений), и это глупо, если служба выполнена, и пользователь думает, что все загружено, но загрузка фотографий находится в другом потоке, ожидающем обратного вызова из амазонка стрелять. – Beemo

+0

Я был в замешательстве с тем, о чем вы говорили в своем OP. Я обновил свой ответ. –