0

Хороший день,Сохранение информации в Graph ответ Запрос

Я хотел бы сохранить информацию в List<String> ценности, которые я получаю от Graph Request, но когда я вернусь в list, ее пустой. Может кто-нибудь помочь мне, почему?

private List<String> getFriends(AccessToken accessToken) { 
    List<String> friendsName = new ArrayList<String>(); 
    GraphRequest requestt = 
      new GraphRequest(
        accessToken, 
        "/me/taggable_friends", 
        null, 
        HttpMethod.GET, 
        new GraphRequest.Callback() { 
         public void onCompleted(GraphResponse response) { 
         JSONObject obj = response.getJSONObject(); 
         JSONArray arr; 
         try { 
          arr = obj.getJSONArray("data"); 
          for (int l=0; l < arr.length(); l++) { 
           JSONObject oneByOne = arr.getJSONObject(l); 
           System.out.println(oneByOne.opt("name").toString()); 
           friendsName.add(oneByOne.opt("name").toString()); 

          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         } 
        } 
      ); 

    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "name"); 
    requestt.setParameters(parameters); 
    requestt.executeAsync(); 
    return friends; 
    } 

ответ

1

Выполняется запрос асинхронно. Это означает, что запрос не будет выполнен сразу после requestt.executeAsync();, но в ближайшем будущем. Вот почему вы настраиваете обратный вызов в конструкторе. Вы должны обработать свой friendsList в обратном вызове onCompleted вместо его возврата в getFriends.

Вы можете изменить метод getFriends, чтобы принять GraphRequest.Callback в качестве второго параметра и не возвращать его. Так это будет выглядеть более или менее так:

public void getFriends(AccessToken token, GraphRequest.Callback callback) { 
    GraphRequest requestt = new GraphRequest(token, "/me/taggable_friends", 
              null, HttpMethod.GET, callback); 
    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "name"); 
    requestt.setParameters(parameters); 
    requestt.executeAsync(); 
} 

И тогда вы можете назвать это так:

getFriends(accessToken, new GraphRequest.Callback() { 
       public void onCompleted(GraphResponse response) { 
       List<String> friendsName = new ArrayList<String>(); 
       JSONObject obj = response.getJSONObject(); 
       JSONArray arr; 
       try { 
        arr = obj.getJSONArray("data"); 
        for (int l=0; l < arr.length(); l++) { 
         JSONObject oneByOne = arr.getJSONObject(l); 
         System.out.println(oneByOne.opt("name").toString()); 
         friendsName.add(oneByOne.opt("name").toString()); 
        } 
        //CONSUME YOUR FRIENDS LIST HERE 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       } 
      } 
    ); 

Было бы хорошей идеей переименовать метод getFriends в getFriendsAsync

Лучшей идеей было бы создать свой собственный, более определенный обратный вызов.

public interface FacebookFriendsCallback { 
    void onFriendsReceived(List<String> friendsNames); 
} 

И использовать его так:

public void getFriends(AccessToken token, FacebookFriendsCallback callback) { 
    List<String> friendsName = new ArrayList<String>(); 
    GraphRequest requestt = 
     new GraphRequest(
      accessToken, 
      "/me/taggable_friends", 
      null, 
      HttpMethod.GET, 
      new GraphRequest.Callback() { 
       public void onCompleted(GraphResponse response) { 
       JSONObject obj = response.getJSONObject(); 
       JSONArray arr; 
       try { 
        arr = obj.getJSONArray("data"); 
        for (int l=0; l < arr.length(); l++) { 
         JSONObject oneByOne = arr.getJSONObject(l); 
         System.out.println(oneByOne.opt("name").toString()); 
         friendsName.add(oneByOne.opt("name").toString()); 

        } 
        callback.onFriendsReceived(friendsName); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       } 
      } 
    ); 
    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "name"); 
    requestt.setParameters(parameters); 
    requestt.executeAsync(); 
} 

И затем вызвать метод getFriends:

getFriends(accessToken, new FacebookFriendsCallback() { 
    public void onFriendsReceived(List<String> friendsNames) { 
     //consume list here 
    } 
} 

Примечание: это не испытанный, готовый для копирования-вставки кода. Скорее, идея для вашей собственной реализации. Также потребуется некоторая обработка ошибок.

+0

если я обрабатываю friendList внутри onCompleted. Как я могу вывести его за пределы метода getFriends? Потому что я буду использовать список в методе, вызывающем метод getFriends. Спасибо – user3698799

+0

Вы можете изменить метод 'getFriends', чтобы взять параметр« GraphRequest.Callback »в качестве параметра и передать его в запрос. См. Мой обновленный ответ. – pkuszewski