Я использую два 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. (То же самое для документа, в документе, который я сопоставил с путем).