Здравствуйте.
Возник вопрос о том, как можно вернуть данные полученные от 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)
{
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Программирую на Java на MacOSРазрешение экрана 2560х1600, однако при создании объекта типа JFrame с заданным размером 1200х900 или более объект уже не влезает...
Как отсортировать массив(лист) строк с помощью лямбды по убыванию?
Есть файл blatest, нужно чтобы когда я на него нажимал он открывал мою программу и в ней считывался этот файл