Как создать единый класс веб-службы залпа для использования в приложении для Android?

Мое приложение для Android использует несколько сетевых вызовов в одном действии, и у меня есть несколько таких действий, где я должен использовать как отправку, так и получение запросов. Я хочу создать один класс «VolleyWebservice» и вызывать его в нескольких действиях вместо того, чтобы писать полный код залпа. Я относительно новичок в разработке Android, и я не понимаю, где я ошибаюсь.

public class VolleyWebService {

public JSONObject result;

public JSONObject getResponse(String url, Context mContext) {
    RequestQueue mQueue = Volley.newRequestQueue(mContext);
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.e(TAG, "Anshuman" + response.toString());

            result =  response;
        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                }
            });

    mQueue.add(request);
   return result;
}
}

Метод в моей деятельности, где я вызываю этот класс

    private void callFunctionGetDist() {
    ProgressDialog progressDialog;
    progressDialog = ProgressDialog.show(recorddata.this, "", "Please Wait...", true);
    JSONObject response = new VolleyWebService().getResponse(urlConfigClass.GET_DISTRICT, this);
    try {
        if (response.toString().contains("Status:Success,Details")){
            arrDistName.clear();
            arrDistCode.clear();
            arrDistName.add("Select District Name");
            arrDistCode.add("Select District Code");
            JSONArray jsonArray = response.getJSONArray("Status:Success,Details");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jobJ = jsonArray.getJSONObject(i);
                String scheName = jobJ.getString("post");
                JSONObject jobJDist = new JSONObject(scheName);
                String distname = jobJDist.getString("District");
                String distcode = jobJDist.getString("DistrictCode");
                arrDistName.add(distname);
                arrDistCode.add(distcode);
            }
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(recorddata.this,
                    R.layout.custom_textview_to_spinner, arrDistName);
            // Drop down layout style - list view with radio button
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            // attaching data adapter to spinner
            district.setAdapter(dataAdapter);
            progressDialog.dismiss();
        }else{
            progressDialog.dismiss();
            Toast.makeText(getApplicationContext(), "Response is null or empty", Toast.LENGTH_LONG).show();
        }
    } catch (Exception volleyError) {
        progressDialog.dismiss();
        Toast.makeText(getApplicationContext(), volleyError.getMessage(), Toast.LENGTH_LONG).show();
    }
}

Я пытался создать тот же класс, но не могу получить ответ на другие действия. Хотя я получаю правильный ответ в ответе Volley jsonbject, ответ возвращает null в других действиях.

Я хочу, чтобы объект результата возвращал ответ в моей активности RecordData.

Это то, что я пробовал до сих пор, но не повезло!

  public void postResponse (String url, Context mContext, final VolleyResponseListener listener) {
    try {
        String encodedUrl = url.replace(" ", "%20") + "";
        if (encodedUrl.contains("("))
            encodedUrl = encodedUrl.replace("(", "%28");
        if (encodedUrl.contains(")"))
            encodedUrl = encodedUrl.replace(")", "%29");
        encodedUrl = encodedUrl.replace(" ", "%20");

        RequestQueue mQueue = Volley.newRequestQueue(mContext);
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POst, encodedUrl, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.e(TAG, "Anshuman" + response.toString());

                listener.onSuccess(response);
            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        listener.onError(error);
                    }
                }) {
            @Override
            protected Map<String, String> getParams() {
                return new HashMap<>();
            }

        };

        mQueue.add(request);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Что вы уже пробовали? Пожалуйста, опубликуйте свой код, чтобы мы могли помочь вам повторить его и конкретно определить вашу проблему.

Tenten Ponce 30.05.2019 13:26

Привет, только что опубликовал код моего класса Volley. Пожалуйста, посмотрите. я хочу, чтобы "результат" jsonobject возвращал ответ залпа в другом классе.

Anshuman 30.05.2019 13:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ради достижения вашей цели (не принимая во внимание принципы архитектуры и кодирования) вы можете передать обратный вызов:

public class VolleyWebService {

public interface VolleyResponseListener {
  void onSuccess(JSONObject response);
  void onError(VolleyError error);
}

public JSONObject result;

public JSONObject getResponse(String url, Context mContext, VolleyResponseListener listener) {
    RequestQueue mQueue = Volley.newRequestQueue(mContext);
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.e(TAG, "Anshuman" + response.toString());

            listener.onSuccess(response);
        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                   listener.onError(error);
                }
            });

    mQueue.add(request);
   return result;
}
}

Чтобы использовать его:

volleyWebService.getResponse("your url", context, new VolleyResponseListener() {
   @Override
   void onSuccess(JSONObject response) {
      //do what you want on success
   }

   @Override
   void onError(VolleyError error) {
      //do what you want on error
   }
});

Любые предложения о том, как я могу сделать то же самое для почтовых запросов?

Anshuman 31.05.2019 14:36

вы можете сделать его параметром или создать для него другой метод. Попробуйте поиграть с ним.

Tenten Ponce 31.05.2019 14:40

Пожалуйста, взгляните на мой оригинальный пост. Я разместил свой класс постответа.

Anshuman 31.05.2019 14:45

Другие вопросы по теме