2016-04-25 9 views
1

Wie würde ich diesen asynchronen Anruf zu RX Android zu transformieren und die Fähigkeit haben, um es auf andere Anrufe zu ketten? Momentan verwende ich EventBus, um zu informieren, dass Senden erfolgreich oder fehlgeschlagen ist, aber ich möchte RX hauptsächlich für Verkettungszwecke verwenden.Transform AmazonS3 senden an RX android beobachtbar

public void SendToAmazon(Intent i) { 
    try { 
     // take params from intent 
     // ....................... 

     // Create an S3 client 
     s3Client = new AmazonS3Client(new BasicAWSCredentials(MY_ACCESS_KEY_ID, MY_SECRET_KEY)); 
     // Set the region of your S3 bucket 
     s3Client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.EU_CENTRAL_1)); 

     String newFilename = fileName+"/img.jpg"; 
     PutObjectRequest putObjectRequest = new PutObjectRequest(
       AmazonS3FetchParams.MY_BUCKET_NAME, newFilename, new java.io.File(fileURI)) 
       .withCannedAcl(CannedAccessControlList.PublicRead) 
       .withStorageClass(StorageClass.Standard); 
     try { 
      putObjectRequest.setGeneralProgressListener(new S3ProgressListener() { 
       @Override 
       public void onPersistableTransfer(PersistableTransfer persistableTransfer) { 

       } 

       @Override 
       public void progressChanged(com.amazonaws.event.ProgressEvent progressEvent) { 
        if (progressEvent.getEventCode() == ProgressEvent.COMPLETED_EVENT_CODE) { 
         Log.d("Info", "TRANSFER finished: " + progressEvent.getBytesTransferred() + " bytes"); 
         SentToS3Event sentEvent = new SentToS3Event(fileName, fileURI, position, 
           0, from, nrRetry, messageDbId, getAmazonImageUrl(fileName)); 
         EventBus.getDefault().post(sentEvent); 
        } else if (progressEvent.getEventCode() == ProgressEvent.FAILED_EVENT_CODE) { 
         SentToS3Event sentEvent = new SentToS3Event(fileName, fileURI, position, 
           -1, from, nrRetry, messageDbId, getAmazonImageUrl(fileName)); 
         EventBus.getDefault().post(sentEvent); 
        } 
       } 
      }); 

      PutObjectResult objectResult = s3Client.putObject(putObjectRequest); 
      error = 0; 
     } catch (AmazonClientException aex) { 
      Log.e("Info", "AMAZON EXCEPTION ! " + aex.getMessage()); 
     } 
    } catch (Exception e) { 
     error = -1; 
    } 
} 

`

Antwort

2

einen Blick auf dieses Stück Code nehmen. Ich habe es geschafft, es in einer anderen Situation funktionieren zu lassen.

final PutObjectRequest putObjectRequest = new PutObjectRequest("a", "b", "c"); 
    Observable.create(new Observable.OnSubscribe<SomeAmazonModel>() { 
     @Override 
     public void call(final Subscriber<? super SomeAmazonModel> subscriber) { 
      putObjectRequest.setGeneralProgressListener(new S3ProgressListener() { 
       @Override 
       public void onPersistableTransfer(PersistableTransfer persistableTransfer) { 

       } 

       @Override 
       public void progressChanged(com.amazonaws.event.ProgressEvent progressEvent) { 
        if (progressEvent.getEventCode() == ProgressEvent.COMPLETED_EVENT_CODE) { 
         subscriber.onNext(new SomeAmazonModel(ProgressEvent.COMPLETED_EVENT_CODE)); 
         subscriber.onCompleted(); 
        } else if (progressEvent.getEventCode() == ProgressEvent.FAILED_EVENT_CODE) { 
         subscriber.onNext(new SomeAmazonModel(ProgressEvent.COMPLETED_EVENT_CODE)); 
        } 
       } 
      }); 
     } 
    }).subscribe(new Action1<SomeAmazonModel>() { 
     @Override 
     public void call(SomeAmazonModel someAmazonModel) { 
      // Subscribe to above Observable and handle result 
      someAmazonModel.getEventCode(); 
     } 
    }); 
+0

Dies funktioniert, aber können Sie ein weiteres Detail hinzufügen, wie Sie nächste Anrufe in RX-Weise verketten? – miroslavign

+0

Können Sie es ein wenig erklären "Kette nächste Anrufe"? Möchten Sie einen weiteren Anruf ausführen, nachdem der erste erfolgreich war? Oder führen Sie jedes Mal einen Anruf aus, wenn etwas passiert ist, z. "Knopf drücken". Oder führen Sie mehrere Anrufe nacheinander aus? – Rzodkiewka

+0

Es tut mir leid, irgendwie meinen Weg mit RX, so dass meine Terminologie möglicherweise nicht die richtige ist. Was ich also brauche, ist, dass ich nach der asynchronen Ausführung von S3 send mehr RX-Aufrufe ausführen muss. Bitte sehen Sie sich an: https://github.com/BoltsFramework/Bolts-Android#chaining-tasks-together Das ist etwas, was ich mit RX erreichen möchte. – miroslavign