2016-04-23 16 views
1

複数のイメージをサーバーに順次アップロードする実装方法を探しています。私はhttp://uploads.imからAPIを使用して画像をアップロードしています。 複数の画像を1つのマルチパートPOSTリクエストで選択することはできません。それゆえ、私は画像を順番にアップロードしなければならない。イメージをREST APIに順次アップロードする

私は以下のようなインターフェースを持っています。 enter image description here

ユーザーは複数の写真を「クリック」し、これはhttp://uploads.imにアップロードする必要があります。アップロードされた画像のURLを使用してAPIからの応答が返ってくると、別の画像などをアップロードする必要があります。また、すべてのイメージをイメージサーバーにアップロードしたら、サーバーにURLリストを送信する必要があります。このリストには、これらの詳細が格納されています。ここで

は、私は上記のコードでは)今

@OnClick({R.id.pic_photo_0 
     , R.id.pic_photo_1 
     , R.id.pic_photo_2 
     , R.id.pic_photo_3 
}) //Bind with butterknife 
public void onClickPhotoFrame(View view) 
{ 
    // Start CameraActivity 
    Intent startCustomCameraIntent = new Intent(this, CameraActivity.class); 
    startActivityForResult(startCustomCameraIntent, REQUEST_CAMERA); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode != RESULT_OK) 
    { 
     return; 
    } 

    if (requestCode == REQUEST_CAMERA) 
    { 
     Uri photoUri = data.getData(); 
     //based on which imageview created the camera request, load it with the above image 
     Picasso.with(getApplicationContext()).load(photoUri).fit().into(imageView0); 
    } 
} 

1時までやっていることであるonActivityResultメソッドを呼び出したビューを知って、それは可能ですか?それに基づいて、私はカメラからサムネイルで画像ビューを設定することができます。

2)カメラで返されたuriをarraylistに追加します。このarraylistは後でループして画像をアップロードするために使用できます。この方法が問題ないかどうか教えてください。

私は

for (int i = 0; i < imageStorageList.size(); i++) 
{ 
    Call<ImageUploadResponse> call = new ImageUploadHelper(). 
      UploadImage(new File(imageStorageList.get(i).getPath())); 

    call.enqueue(new Callback<ImageUploadResponse>() 
    { 
     @Override 
     public void onResponse(Call<ImageUploadResponse> call, Response<ImageUploadResponse> response) 
     { 
      // do some magic here to know which image was uploaded 
     } 

     @Override 
     public void onFailure(Call<ImageUploadResponse> call, Throwable t) 
     { 


     } 
    }); 
} 

3改造を経て以下のように画像をアップロードしています)私は上記の戦略がOKではない非常に確信しています。これを実装する方法を教えてください。

答えて

2

1)上記のコードでは、どのビューが onActivityResultメソッドと呼ばれているか知ることができますか?それに基づいて、カメラからサムネイル で画像ビューを設定することができます。

Viewは、カメラを起動するための標準的な方法はありませんIntentあなたが本当にそれを知っている必要がある場合は、ローカル変数を作成することができます。

private ImageView lastClickedView; 

はその後onClickPhotoFrameでこれを行う:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode != RESULT_OK) 
    { 
     return; 
    } 

    if (requestCode == REQUEST_CAMERA) 
    { 
     Uri photoUri = data.getData(); 
     //based on which imageview created the camera request, load it with the above image 
     Picasso.with(getApplicationContext()).load(photoUri).fit().into(lastClickedView); 
    } 
} 

public void onClickPhotoFrame(View view){ 
    lastClickedView = (ImageView) view; 
    // Start CameraActivity 
    Intent startCustomCameraIntent = new Intent(this, CameraActivity.class); 
    startActivityForResult(startCustomCameraIntent, REQUEST_CAMERA); 
} 

そしてonActivityResultでは、この場合の処理​​を追加します

2)カメラで返されたuriをarraylist に追加しています。これは後で使用することができます画像をアップロードしてアップロードしてください。このアプローチがOKなら、 をお知らせください。

私の意見では、あなたのアプローチはOKです。しかし私はあなたの別の答えを見た:Call same retrofit method sequentially for result using RxJava

私が理解したように、あなたはRxJavaを使ってそれをしたい。

ので、これは可能な方法の一つである(あなたの答えからコピーされ、ビット変更):

Observable.from(imageStorageList) 
      .flatMap(uri -> new ImageUploadHelper().uploadImage(new File(uri.getPath()))) 
      .subscribe(imageUploadResponseObservable -> { 

       }, throwable -> {/*handle it here*/}); 

利点:

  • シンプルな実装

短所:

  • 実際にこのバリアントはエラーを処理しません。つまり、エラーが発生した場合、画像をもう一度アップロードする必要があります。

どのようにこの問題を解決するには?

I. RxJavaを使用しない場合は、ジョブでも同様です。ライブラリandroid-priority-jobqueueを使用してください。これらのジョブはの持続性になり、エラーの場合は指数バックオフで繰り返されます。

II。独自のメカニズムを実装します。これはサーバー上にイメージをアップロードし、永続的になります。

+0

ありがとうございました。 –

+0

私は別の質問があります。画像のアップロードが完了したら、この呼び出しから受け取ったデータを使用してoncompleted()メソッドから別のレトロフィットコールを作成できますか?もしそうでなければ、別の改造呼出しをどうやって連鎖できますか?私が見たすべての例では、フラットマップが連鎖呼び出しに使用されていることがわかります。私の場合、私はこの呼び出しを実行する方法を理解していません –

+0

@rakeshkashyap、 'uploadImage'が' imageUploadResponse'を返すと仮定します。この場合、あなたは次に何をする必要があります。 '.flatMap(。URI - >新しいImageUploadHelper()uploadImage(新しいファイル(uri.getPath())))の地図(レスポンス - > {/ *応答にあなたがやりたいです* /}) ' – Alexander

関連する問題