2016-04-25 8 views
1

RX And​​roidを使用するようにこの非同期呼び出しを変換する方法と、 を他の呼び出しにチェーンする方法はありますか? 現在、EventBusを使用して送信が成功したか失敗したかを通知しますが、主に連鎖目的でRXを使用したいと考えています。Amazon S3をRXに送信するandroid observable

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; 
    } 
} 

`

答えて

2

コードのこの作品を見てみましょう。私は別の状況でそれを動作させることができました。

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

これは機能しますが、RX方式で次のコールをチェーンする方法の詳細をもう1つ追加できますか? – miroslavign

+0

あなたはそれを少し説明してもらえますか?最初に成功した後に別のコールを実行しますか?何か起きるたびにコールを実行する。 "ボタンを押してください"。または、複数の呼び出しを1つずつ実行することができますか? – Rzodkiewka

+0

申し訳ありませんが、RXを使用して私のやり方を開始するので、私の用語が正しくない可能性があります。ですから、私が必要とするのは、S3 sendの非同期実行後に、より多くのRX呼び出しを実行する必要があるということです。どうぞよろしくお願いいたします。 https://github.com/BoltsFramework/Bolts-Android#chaining-tasks-together これはRXで達成しようとしていることです。 – miroslavign

関連する問題