2 回答

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊
有一種解決此問題的常用方法,即定義一個(gè)回調(diào)方法,在調(diào)用填充這些值后將這些值返回給您,就像這樣(我的 java 生銹了,請(qǐng)耐心等待.. .)
定義一個(gè)接口:
interface Callback{
void apiResponseCallback(ArrayList<Page> result);//whatever your model is, make the array of that type
}
然后,在您的常規(guī) 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
}
然后,當(dāng)你打電話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();
}

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
是的。這里:
request.executeAsync();
觸發(fā)異步請(qǐng)求。但是你的“當(dāng)前”線程只是繼續(xù)做:
return foundPages;
它返回一個(gè)空列表。
該列表稍后會(huì)被填充,但在該方法返回的那一刻,該列表仍然是空的?;蛘咧皇潜惶顫M。誰知道呢,因?yàn)樗鼤?huì)在未來某個(gè)未知的時(shí)間點(diǎn)異步填充。
一個(gè)解決方案可能是讓一些其他變量/字段告訴您數(shù)據(jù)已到達(dá)并推入列表。
或者,該方法可以只發(fā)出一個(gè)同步請(qǐng)求,簡(jiǎn)單地阻止調(diào)用者繼續(xù)進(jìn)行,直到數(shù)據(jù)到達(dá)。
你看,你不能兩全其美:當(dāng)你不等待結(jié)果到達(dá)時(shí),你不應(yīng)該期望它們立即可用。
添加回答
舉報(bào)