簡體   English   中英

如何將Facebook Graph API的結果添加到Java中的數組列表

[英]How to add results of Facebook Graph api to array list in Java

我正在使用Facebook圖形api找出用戶所在的頁面。 當查詢返回一個json對象時,它具有我所需要的,但是由於某種原因,它不想添加到我的數組列表中。 正確的值顯示在log.d中,由於某種原因,它似乎跳過了我的arraylist。 有任何想法嗎?

查找頁面功能

private ArrayList<String> foundPages;
private JSONObject jsonObject; 

public ArrayList<String> findPages()
{
    accessToken = AccessToken.getCurrentAccessToken();
    foundPages = new ArrayList<>();

    GraphRequest request = GraphRequest.newGraphPathRequest(
            accessToken,
            "/me/accounts",
            new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse response) {

                    try {

                        jsonObject = response.getJSONObject();
                        for(int i=0; i < jsonObject.getJSONArray("data").length(); i++)
                        {
                         page = response.getJSONObject().getJSONArray("data").getJSONObject(i).getString("name");
                            Log.d("viewmodel",page);
                            foundPages.add(page);

                        }

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

    request.executeAsync();


    return foundPages;
} 

有一個解決此問題的通用方法,即定義一個回調方法,在調用填充了這些值之后,這些方法將向您返回這些值(類似這樣(我的Java很生銹,請耐心等待。)。 。)

定義一個接口:

 interface Callback{
        void apiResponseCallback(ArrayList<Page> result);//whatever your model is, make the array of that type
    }

然后,在常規的findPages方法中,將其更改為:

public void findPages(Callback callback) {
    //
    // 
    ........
     for(int i=0; i < jsonObject.getJSONArray("data").length(); i++)
                    {
                     page = response.getJSONObject().getJSONArray("data").getJSONObject(i).getString("name");
                        Log.d("viewmodel",page);
                        foundPages.add(page);

                    } 
    callback.apiResponseCallback(foundPages);//here we are returning the data when it is done
}

然后,當您調用findPages

findPages(new Callback() {
        @Override
        public void apiResponseCallback(ArrayList<Page> result) {
            here, this result parameter that comes through is your api call result to use, so result will be your populated pages to use.
        }
    });
}

為了完整性:

public void findPages(Callback callback)
{
    accessToken = AccessToken.getCurrentAccessToken();
    foundPages = new ArrayList<>();

    GraphRequest request = GraphRequest.newGraphPathRequest(
            accessToken,
            "/me/accounts",
            new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse response) {

                    try {

                        jsonObject = response.getJSONObject();
                        for(int i=0; i < jsonObject.getJSONArray("data").length(); i++)
                        {
                         page = response.getJSONObject().getJSONArray("data").getJSONObject(i).getString("name");
                            Log.d("viewmodel",page);
                            foundPages.add(page);

                        }
                        callback.apiResponseCallback(foundPages);

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

    request.executeAsync();
} 

是的。 這里:

request.executeAsync();

觸發異步請求。 但是您的“當前”線程只是繼續做:

return foundPages;

並返回一個空列表。

該列表稍后會被填充,但是當該方法返回時,該列表仍然為空。 或只是被填滿。 誰知道,因為它會在未來某個未知的時刻被異步填充。

一種解決方案是讓其他變量/字段告訴您數據已到達並推送到列表中

另外,該方法可以發出一個同步請求,只是阻止調用者進行處理,直到數據到達為止。

您會看到,兩種方式無法同時實現:當您不等待結果到達時,就不應期望它們立即可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM