Android Volley - JsonArrayRequest возвращает нулевой объект - PullRequest
0 голосов
/ 24 октября 2019

В приведенном ниже коде я пытаюсь отправить HttpRequest в мой API, чтобы получить местоположения, которые называются JSONArray. Я использую библиотеку Volley и JsonArrayRequest. Проблема в том, что когда я устанавливаю свою локальную переменную JSONArray в лямбде, у меня есть правильное значение, но когда я возвращаю его в конце функции, объект становится нулевым. Я предполагаю, что возврат выполняется до завершения запроса, но я могу ошибаться.

private RequestQueue requestQueue; //<----Global 

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
        setContentView(R.layout.activity_map);

        //Initialization of RequestQueue Object
        requestQueue = Volley.newRequestQueue(getApplicationContext());
}

//Setting map settings, checking permissions etc..

private JSONArray getUsersLocation() {
        AtomicReference<JSONArray> result = new AtomicReference<>(new JSONArray());
        JsonArrayRequest request = new JsonArrayRequest
                (Request.Method.GET, API_URL + "getLocations", null, response -> {
                    result.set(response);
                   //Here I have correct value of result (JSONArray)
                    System.out.println(result.get()); 
                },
                        error -> {
                            Toast.makeText(getApplicationContext(), "Cannot update users' location :" + error, Toast.LENGTH_LONG).show();
                        });
        requestQueue.add(request);
        return result.get(); //<----- Here my result is NULL
    }

Я ожидаю, что функция getUsersLocation () вернет объект JSONArray, который приходит из ответа.

1 Ответ

0 голосов
/ 24 октября 2019

Http-запрос в volley является асинхронным, это означает, что он не блокирует выполнение, поэтому в вашем коде при создании запроса оператор return выполняется до завершения запроса, поэтому он возвращает ноль. чтобы исправить это, я использую segsst для создания интерфейса и реализации обратных вызовов. вот что вы должны сделать:

public interface HttpCallback {

     public void onSuccess(JSONArray array)

}

И изменить свой метод так:

private JSONArray getUsersLocation(HtttpCallback callback) {
    AtomicReference<JSONArray> result = new AtomicReference<>(new JSONArray());
    JsonArrayRequest request = new JsonArrayRequest
            (Request.Method.GET, API_URL + "getLocations", null, response -> {
                result.set(response);
               //Here I have correct value of result (JSONArray)
                System.out.println(result.get());
                callback.onSuccess(response):
            },
                    error -> {
                        Toast.makeText(getApplicationContext(), "Cannot update users' location :" + error, Toast.LENGTH_LONG).show();
                    });
    requestQueue.add(request);
}
...