亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

慕蓋茨4494581 2023-05-10 15:18:39
我正在使用 Facebook graph 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;} 
查看完整描述

2 回答

?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

有一種解決此問題的常用方法,即定義一個回調方法,在調用填充這些值后將這些值返回給您,就像這樣(我的 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();


查看完整回答
反對 回復 2023-05-10
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

是的。這里:

request.executeAsync();

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

return foundPages;

它返回一個空列表。

該列表稍后會被填充,但在該方法返回的那一刻,該列表仍然是空的?;蛘咧皇潜惶顫M。誰知道呢,因為它會在未來某個未知的時間點異步填充。

一個解決方案可能是讓一些其他變量/字段告訴您數據已到達并推入列表。

或者,該方法可以只發出一個同步請求,簡單地阻止調用者繼續進行,直到數據到達。

你看,你不能兩全其美:當你不等待結果到達時,你不應該期望它們立即可用。


查看完整回答
反對 回復 2023-05-10
  • 2 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號