Android VKAPI вернуть полученные данные

257
30 марта 2017, 19:30

Здравствуйте. Возник вопрос о том, как можно вернуть данные полученные от VK API Android SDK? у меня есть функция, которая должна вернуть полученные данные которые вернул VKResponse однако когда я делаю return data, то функция возвращает пустое значение...

код функции

public static ArrayList<String> getUsers(String city, int ofset)
{
    final ArrayList<String> rez = new ArrayList<>();
    VKRequest search_users = new VKRequest("users.search", VKParameters.from("count", 1, "hometown", city, "sex", 1, "status", 6, "offset", ofset, VKApiConst.FIELDS, "photo_max_orig, contacts, last_seen, photo_id"));
    search_users.executeWithListener(new VKRequest.VKRequestListener() {
        @SuppressLint("LongLogTag")
        @Override
        public void onComplete(VKResponse response) {
            super.onComplete(response);
            try
            {
                jUsers = new JSONObject(response.responseString);
                userObject = jUsers.getJSONObject("response");
                usersArray = userObject.getJSONArray("items");
                Log.e("VK_FOUND_USERS_ARRAY", String.valueOf(usersArray));
                for (int i = 0; i < usersArray.length(); i++)
                {
                    object = usersArray.getJSONObject(i);
                    Log.e("VK_CONCRETE_USER_OBJECT", String.valueOf(object));

                    rez.add( object.getString("first_name") );
                    rez.add( object.getString("last_name") );
                    rez.add( object.getString("photo_max_orig") );
                    if ( object.has("home_phone") )
                        rez.add( object.getString("home_phone") );
                    if ( object.has("mobile_phone") )
                        rez.add( object.getString("mobile_phone") );
                }
            }
            catch (JSONException je)
            {
                je.printStackTrace();
            }
        }
    });
    Log.e("VK_FUNCTION_REZULT", String.valueOf(rez));
    return rez; //возвращает ""
}

З.Ы в Java и Android я пока что ещё новичок, так что не судите строго за код и такой вопрос=)

UPDATE 1 вот код функции как предложил @rjhdby

public static ArrayList<String> getUsers(String city, int ofset)
{
    final ArrayList<String> rez = new ArrayList<>();
    VKRequest search_users = new VKRequest("users.search", VKParameters.from("count", 1, "hometown", city, "sex", 1, "status", 6, "offset", ofset, VKApiConst.FIELDS, "photo_max_orig, contacts, last_seen, photo_id"));
    search_users.executeWithListener(new VKRequest.VKRequestListener() {
        @SuppressLint("LongLogTag")
        @Override
        public void onComplete(VKResponse response) {
            super.onComplete(response);
            try
            {
                jUsers = new JSONObject(response.responseString);
                userObject = jUsers.getJSONObject("response");
                usersArray = userObject.getJSONArray("items");
                Log.e("VK_FOUND_USERS_ARRAY", String.valueOf(usersArray));
                for (int i = 0; i < usersArray.length(); i++)
                {
                    object = usersArray.getJSONObject(i);
                    Log.e("VK_CONCRETE_USER_OBJECT", String.valueOf(object));

                    rez.add( object.getString("first_name") );
                    rez.add( object.getString("last_name") );
                    rez.add( object.getString("photo_max_orig") );
                    if ( object.has("home_phone") )
                        rez.add( object.getString("home_phone") );
                    if ( object.has("mobile_phone") )
                        rez.add( object.getString("mobile_phone") );
                }
            }
            catch (JSONException je)
            {
                je.printStackTrace();
            }
            Log.e("VK_FUNCTION_REZULT", String.valueOf(rez));
            return rez; //Error:(403, 24) error: incompatible types: unexpected return value
        }
    });
}
Answer 1
search_users.executeWithListener(new VKRequest.VKRequestListener() {

Запускается асинхронно и вызывает VKRequest.VKRequestListener() тогда, когда получен ответ.

Соответственно тут у вас rez еще пустой, так как листенер еще не отработал.

Log.e("VK_FUNCTION_REZULT", String.valueOf(rez));
return rez; //возвращает ""

UPD

На самом деле это очень плохая идея синхронно ожидать ответ от метода, результат которого зависит от вложенного асинхронного кода.

Есть два пути, один плохой, другой хороший.

1) Плохой. Очень плохой. Даже и не думайте о его использовании, привожу только для понимания того, как это все работает.

        catch (JSONException je){
            je.printStackTrace();
        }
    }
});
while(rez.size() == 0){
    //курим
}
return rez;

2) Обычно делается по другому.

Меняем сигнатуру вашего метода следующим образом.

public static void getUsers(String city, int ofset)

Добавляем еще один метод, который принимает результат и делает то, что вам нужно

public static void doSomethingWhenUsersReceived(ArrayList<String> rez){
    //обрабатываем результат
}

В теле листенера, когда результат получен, вызываем этот метод

            MyClass.doSomethingWhenUsersReceived(rez);
        }
        catch (JSONException je)
        {
READ ALSO
Фактический размер JFrame не совпадает с задаваемым

Фактический размер JFrame не совпадает с задаваемым

Программирую на Java на MacOSРазрешение экрана 2560х1600, однако при создании объекта типа JFrame с заданным размером 1200х900 или более объект уже не влезает...

230
Сортировка с помощью лямбда-выражений

Сортировка с помощью лямбда-выражений

Как отсортировать массив(лист) строк с помощью лямбды по убыванию?

270
Как запускать программу через файл и читать его?

Как запускать программу через файл и читать его?

Есть файл blatest, нужно чтобы когда я на него нажимал он открывал мою программу и в ней считывался этот файл

235