Как обработать пустую позицию в списке изображений и массивов документов при публикации с помощью Multipart body с помощью Retrofit в Android? - PullRequest
0 голосов
/ 09 мая 2019

Я использую два Recyclerviews в своем приложении (одно для добавления изображений и другое для добавления документа, пользователю не было разрешено добавлять более 5 изображений и документов). Я загружаю его на сервер, используя Retrofit.

Что я сделал:

В настоящее время я написал код таким образом, что пользователь должен обязательно добавить 5 изображений и 5 документов, только тогда он будет успешно загружен и опубликован. Если пользователь добавляет менее 5 либо в массив документов, либо в массив изображений, приложение аварийно завершает работу, показывая arrayIndexOutOfBoundsException.

Мои требования:

Мне нужно обработать сценарий таким образом, чтобы, даже если пользователь добавляет менее 5 (например, и изображения, и документы, если пользователь добавляет 2 изображения и 3 документа. Или они могут даже добавить 5 изображений, и они могут быть отправлены без добавления даже одного документа) он должен быть опубликован успешно.

Вот что я пробовал до сих пор

Мой интерфейс:

@Multipart
@POST("myapi/myapiendUrl")
Call<POJOClass> myApi (@Header("Authorization") String token,
                                  @Part("user_id") String user_id,
                                  @Part("shipment") String shipment,
                                  @Part("shipment_type") String shipment_type,
                                  @Part("country_of_origin") String country_of_origin,
                                  @Part("delivery_address") String delivery_address,
                                  @Part("pickup_address") String pickup_address,
                                  @Part("doa") String date_of_arrival,
                                  @Part("dom") String date_of_moving,
                                  @Part("delivery_to") String delivery_to,
                                  @Part("port_of_entry") String port_of_entry,
                                  @Part("shipment_fleet") String shipment_fleet,
                                  @Part("require_free_survey") String require_free_survey,
                                  @Part("type_of_service") String type_of_service,
                                  @Part("floor") String floor,
                                  @Part("residential_type") String residential_type,
                                  @Part("elevator") String elevator,
                                  @Part("volume") String volume,
                                  @Part("weight") String weight,
                                  @Part("diplomat_type") String diplomat_type,
                                  @Part("remark") String remark,

                                     @Part("upload_photos[0]") String pos1,
                                     @Part ("upload_photos[1]") String pos2 ,
                                     @Part ("upload_photos[2]") String pos3 ,
                                     @Part("upload_photos[3]") String pos4 ,
                                     @Part("upload_photos[4]") String pos5,

                                     @Part  MultipartBody.Part body,
                                  @Part MultipartBody.Part body2,
                                  @Part MultipartBody.Part body3,
                                  @Part MultipartBody.Part body4,
                                  @Part MultipartBody.Part body5);

В моем классе «Активность» я разместил значения после нажатия кнопки «Отправить»

.
international_submitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {


                showProgressBar();

                user_id = Session.getUserId(context);


                pickDoor = pickupDoorEditText.getText().toString();
                pickRoom = pickupRoomEditText.getText().toString();
                pickStreet = pickupStreetEditText.getText().toString();
                pickTown = pickupTownEditText.getText().toString();
                pickCity = pickupCityEditText.getText().toString();

                international_pickup_address = pickDoor + ", " + pickRoom + "," + pickStreet+ "," +pickTown +"," + pickCity;

                deliveryDoor = deliveryDoorEditText.getText().toString();
                deliveryRoom = deliveryRoomEditText.getText().toString();
                deliveryStreet = deliveryStreetEditText.getText().toString();
                deliveryTown = deliveryTownEditText.getText().toString();
                deliveryState = deliveryStateEditText.getText().toString();
                movingDate = dateOfMoveEditText.getText().toString();
                arrivalDate = dateOfArrivalEditText.getText().toString();

                international_delivery_address = deliveryDoor + "," + deliveryRoom + "," + deliveryStreet + "," + deliveryTown + ","+deliveryState;
                international_remarkss = international_remarks.getText().toString();

                for (int i=0; i<internationalArrayList.size(); i++)
                {
                    internationalBase64ArrayList.add(convertTobase64(internationalArrayList.get(i)));
                }





               for (int i = 0; i<fileModelList.size();i++)
               {
                   File file = new File(fileModelList.get(i).getFilePath());
                   RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
                   MultipartBody.Part body = MultipartBody.Part.createFormData("upload_documents["+i+"]" ,file.getName(), requestBody);

                   partList.add(body);
               }

               RetrofitInterface retrofitInterface = RetrofitClient.getClient().create(RetrofitInterface.class);
                Call<POJOClass> internationalMoving = retrofitInterface.internationalApi("Bearer "+ Session.getToken(context),user_id,international_shipment,international_shipment_type,country,international_delivery_address,international_pickup_address,arrivalDate,movingDate,internationalDeliveryTo,international_portOfEntry,international_shipmentFeetType,international_free_survey,international_type_of_service,international_floor,international_residential_type,international_elevator,international_volume,international_weight,international_diplomat_type,international_remarkss,internationalBase64ArrayList.get(0),internationalBase64ArrayList.get(1),internationalBase64ArrayList.get(2),internationalBase64ArrayList.get(3),internationalBase64ArrayList.get(4),partList.get(0),partList.get(1),partList.get(2),partList.get(3),partList.get(4));
                internationalMoving.enqueue(new Callback<POJOClass>() {
                    @Override
                    public void onResponse(Call<POJOClass> call, Response<POJOClass> response)
                    {
                        if (response.code() == 200)
                        {
                            pojoClass = response.body();

                            if (pojoClass.getStatus().equalsIgnoreCase("success"))
                            {
                                hideProgressBar();
                                Toast.makeText(getApplicationContext(),pojoClass.getMessage(),Toast.LENGTH_LONG).show();
                                Intent intent = new Intent(InternationalActivity.this, MainActivity.class);
                                startActivity(intent);
                            }

                            else
                            {
                                hideProgressBar();


                                Toast.makeText(getApplicationContext(),pojoClass.getStatus(),Toast.LENGTH_LONG).show();
                            }
                        }

                        else
                        {
                            hideProgressBar();

                            Toast.makeText(getApplicationContext(),response.code(),Toast.LENGTH_LONG).show();
                        }

                    }

                    @Override
                    public void onFailure(Call<POJOClass> call, Throwable t)
                    {
                        hideProgressBar();

                        Log.i(TAG,"Error is:->" + t);

                        Toast.makeText(getApplicationContext(),""+t, Toast.LENGTH_LONG).show();


                    }
                });


                }
        }

Что я сейчас сделал, так это то, что я отправил все пять изображений в одном массиве строк (в формате base64), при вызове интерфейса я сопоставил индивидуальную позицию списка со строкой тела MultiPart. (То же самое для документа, в документе, который я сопоставил с путем).

...