2016-01-21 120 views
2

有沒有辦法阻止當前線程並等待圖片上傳到S3?在Android上將圖片上傳到Amazon S3時阻止線程

我的上傳到S3的代碼已經在doInBackground()方法的Android服務中運行(其他網絡調用必須按照特定的順序),所以它不在主UI線程中。我只想知道上傳何時完成,因此我可以關閉通知並向用戶顯示上傳/完成的所有內容。

我使用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

編輯

如果您的服務已結束,你能夠利用任何回調之前,那麼你需要保持你的服務開放的,所以不會發生這種情況。如果您使用的是IntentService,則這些設計被視爲一種「即忘即忘」功能。 你應該看看如何實現一個正常的Service,這樣你就可以開始一個任務並在需要時通過stopSelf()來結束它。

退房http://developer.android.com/guide/components/services.html#ExtendingService

這將會給你當服務停止時進行更多的控制。上傳完成後,您可以停止該服務。或者,如果您想「破解」它,您可以添加一個布爾成員變量並使用循環阻止執行,該循環將輪詢布爾值直到它爲真。您可以在UploadListener方法中將其設置爲True,並且它應該使服務保持打開狀態。

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

對不起安德魯,但是,這並不回答我的問題。我需要阻止來自我稱之爲transferUtility的上傳功能的線程。這段代碼並沒有解決這個問題。 – Beemo

+0

但上傳的代碼已經離開UI線程(在服務線程上),所以在阻止它的時候沒有問題。我保持在該服務中同步的邏輯(不僅僅是照片,所有類型的其他應用程序),而且如果服務完成並且用戶認爲所有內容都已上傳,但是上傳照片在其他線程上等待回調,這很愚蠢亞馬遜火。 – Beemo

+0

我對你在OP中談論的內容感到困惑。我已經更新了我的答案。 –