2016-01-21 158 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中谈论的内容感到困惑。我已经更新了我的答案。 –