Получение com.android.volley.TimeoutError при отправке строки в кодировке base64 - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь загрузить закодированную строку Base64 с некоторыми другими данными на сервер. Проблема в том, что когда я передаю данные формы без base64, он работает отлично. Но когда я пытаюсь передать строку base64, она показывает ошибку.

Моя форма FormActivity.java:

public void submitForm(){
    final ProgressDialog loading = ProgressDialog.show(POIFormActivity.this, "", "Please wait...", false, false);

    _name = name.getText().toString();
    _location = location.getText().toString();
    _city = city.getText().toString();
    _state = state.getText().toString();
    _pin = pin.getText().toString();

    try {
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        String URL = ServerLinks.SUBMIT+"/" + userID;

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d("FINAL_SUBMIT_RESPONSE", response);
                loading.dismiss();
                try {
                    JSONObject object = new JSONObject(response);
                    Log.d("JSON RESPONSE",object.toString());

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                loading.dismiss();
                VolleyLog.d("RESULT_ERROR", "Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }) {

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("name", _name);
                params.put("categories", categoryID);
                params.put("city", _city);
                params.put("location", _location);
                params.put("state",_state);
                params.put("pincode",_pin);
                params.put("image",EncodePhoto1);
                params.put("image1",EncodePhoto2);
                params.put("image2",EncodePhoto3);
                params.put("latitude",LatitudePOI);
                params.put("longitude",LongitudePOI);
                return params;
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("token", OAuth);
                params.put("x-api-key", ServerLinks.API_KEY);
                return params;
            }

        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                5000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        stringRequest.setShouldCache(false);
        requestQueue.add(stringRequest);


    } catch (Exception e) {
        e.printStackTrace();
    }
}

И преобразование изображения в строку Base64 с использованием этого метода:

public String ConvertIntoBase64(File filename){
    try{
        InputStream inputStream = new FileInputStream(filename);
        byte[] bytes;
        byte[] buffer = new byte[8192];
        int bytesRead;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        try {
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        bytes = output.toByteArray();
        String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);
        return encodedString;
    } catch (FileNotFoundException e){
        Toast.makeText(this,e.toString(),Toast.LENGTH_SHORT).show();
        return " ";
    }
}

Можете ли вы помочь мне, как я могу успешно передать значение на сервере или что я делаю неправильно? Есть ли лучший способ сделать это? Заранее спасибо.

1 Ответ

2 голосов
/ 13 марта 2019

Вы отправляете строку в кодировке base64 большого размера. В результате это занимает больше времени, чем обычно. В этом случае вы должны установить более высокое значение времени ожидания.

stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                120000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
...