Функция ArrayList возвращает ноль в Android - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь вернуть значение с моего удаленного сервера, добавить его к ArrayList и показать его на своем ящике в студии Android, но я получаю null. Имя и фамилия в volley содержат это с моего удаленного сервера, но имя ArrayList возвращает null

GetName. java

  public List<String> getDriverName(Context contenxt){
    String COMPLETE_URL = TRANSACTION_DETAIL_URL +  Preferences.getDefaults("email", contenxt);
    Log.i("url", COMPLETE_URL);

    name = new ArrayList<String>();

    StringRequest stringRequest = new StringRequest(Request.Method.GET, COMPLETE_URL, new Response.Listener<String>() {


        @Override
        public void onResponse(String response) {
            Log.i("info", response.toString());

            JSONObject jsonObject = null;
            try {
                jsonObject = new JSONObject(response);
                JSONArray jsonArray = jsonObject.getJSONArray("success");
                if (jsonArray.length() > 0){
                    for (int i=0; i <= jsonArray.length()-1; i++){
                        JSONObject productJson = jsonArray.getJSONObject(i);
                        first_name =productJson.getString("firstName");
                        last_name = productJson.getString("lastName");
                        name.add(first_name);
                        name.add(last_name);
                        Log.d(null, "onResponse: " + last_name);

                    }

                }else{
                    first_name = "";
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            first_name = "";            }
    });
    int socketTimeout = 10000;
    RetryPolicy retryPolicy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    RequestQueue requestQueue = Volley.newRequestQueue(contenxt);
    requestQueue.add(stringRequest);

    return name;
}

Активность панели инструментов

NameAndEmail nameAndEmail = new NameAndEmail();
Log.d(null, "result: " + nameAndEmail.getDriverName(getApplicationContext()));

Результат

D/: result: []

W/art: Before Android 4.1, method int     
android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, 
boolean) would have incorrectly overridden the package-private method in 
android.widget.ListView
I/info: {"success":[{"firstName":"usfdh","lastName":"hseheh"}]}
D/: onResponse: hseheh

1 Ответ

1 голос
/ 07 марта 2020

Вы возвращаете переменную name до того, как ваши данные не поступили.

Вы должны обработать переменную name после получения данных и присвоения этой переменной.

Вы можете сделать что-то вроде этого:

NameAndEmail nameAndEmail = new NameAndEmail();

getDriverName(getApplicationContext()); // Remove return params from method.

Ваш getDriverName () метод будет выглядеть следующим образом:

public void getDriverName(Context contenxt){
    String COMPLETE_URL = TRANSACTION_DETAIL_URL +  Preferences.getDefaults("email", contenxt);
    Log.i("url", COMPLETE_URL);

    name = new ArrayList<String>();

    StringRequest stringRequest = new StringRequest(Request.Method.GET, COMPLETE_URL, new Response.Listener<String>() {


        @Override
        public void onResponse(String response) {
            Log.i("info", response.toString());

            JSONObject jsonObject = null;
            try {
                jsonObject = new JSONObject(response);
                JSONArray jsonArray = jsonObject.getJSONArray("success");
                if (jsonArray.length() > 0){
                    for (int i=0; i <= jsonArray.length()-1; i++){
                        JSONObject productJson = jsonArray.getJSONObject(i);
                        first_name =productJson.getString("firstName");
                        last_name = productJson.getString("lastName");
                        name.add(first_name);
                        name.add(last_name);
                        Log.d(null, "onResponse: " + last_name);

                        /******************************
                        ****** DO PROCESS HERE ********
                        ******************************/

                    }

                }else{
                    first_name = "";
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            first_name = "";            }
    });
    int socketTimeout = 10000;
    RetryPolicy retryPolicy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    RequestQueue requestQueue = Volley.newRequestQueue(contenxt);
    requestQueue.add(stringRequest);
}

Надеюсь, он будет работать. Спасибо.

...