我正在嘗試從美國農(nóng)業(yè)部數(shù)據(jù)庫中獲取食品的 ID 號。我的問題是我可以獲取 JSON 數(shù)據(jù),但我無法將其取消OnPostCreate()。當(dāng)我通過迭代JSONdataWIthIDs中OnPostCreate()所有的數(shù)據(jù)是存在的。但是當(dāng)我嘗試在其他地方使用數(shù)據(jù)時,它是空的。如何將數(shù)據(jù)存儲到數(shù)組中?這是構(gòu)造函數(shù)。 public USDA(String nameOfFoodToSearchFor) { setJSONdataWIthIDs(nameOfFoodToSearchFor); // this returns 0 Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size()); // This does not work. for(String s: JSONdataWIthIDs) { Log.i("TAG OUTPUT", s); } }這是帶有 OnPostCreate 的代碼。private void setJSONdataWIthIDs(String nameOfFood){ final String url1 = "https://api.nal.usda.gov/ndb/search/?format=json&q=" + nameOfFood + "&sort=n&max=25&offset=0&api_key=x5qM9v8PkjZrTf2cVSHzoK7y4GsSBgoQEmJsbwqV"; AsyncTask asyncTask = new AsyncTask() { @Override protected Object doInBackground(Object[] objects) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url1) .build(); Response response = null; try{ response = client.newCall(request).execute(); return response.body().string(); }catch (IOException e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(Object o) { String lines[] = o.toString().split("\\r?\\n"); for(int i = 0; i < lines.length;i++) { JSONdataWIthIDs.add(lines[i]); } //This works for(String s : JSONdataWIthIDs) { Log.i("TAG", s); } } }.execute();}
2 回答

臨摹微笑
TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個贊
onPostExecute 是執(zhí)行流從工作線程(即支持 AsyncTask)返回到 UI 線程的地方。您的日志行:
Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());
發(fā)生在 UI 線程中,并且此時與工作線程并行運(yùn)行。所以結(jié)果不可用

料青山看我應(yīng)如是
TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個贊
問題很簡單。該Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());
語句在onPostExecute()
. 所以JSONdataWIthIDs
是空的。
對異步任務(wù)的調(diào)用是異步完成的 ( doInBackground()
)。并且您正在將值保存到JSONdataWIthIDs
in onPostExecute()
。因此,您只能在異步任務(wù)完成后訪問 ID。
如何將數(shù)據(jù)存儲到數(shù)組中?
數(shù)據(jù)已經(jīng)存儲到 中的數(shù)組中onPostExecute()
。唯一的問題是您只能在onPostExecute()
調(diào)用后才能訪問它。
添加回答
舉報
0/150
提交
取消