Здравствуйте.
Возник вопрос о том, как можно вернуть данные полученные от 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
}
});
}
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)
{
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники