我正在尝试从美国农业部数据库中获取食品的 ID 号。我的问题是我可以获取 JSON 数据,但我无法将其取消OnPostCreate()。当我通过迭代JSONdataWIthIDs中OnPostCreate()所有的数据是存在的。但是当我尝试在其他地方使用数据时,它是空的。如何将数据存储到数组中?这是构造函数。 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贡献1982条经验 获得超2个赞
onPostExecute 是执行流从工作线程(即支持 AsyncTask)返回到 UI 线程的地方。您的日志行:
Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());
发生在 UI 线程中,并且此时与工作线程并行运行。所以结果不可用
料青山看我应如是
TA贡献1772条经验 获得超8个赞
问题很简单。该Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());
语句在onPostExecute()
. 所以JSONdataWIthIDs
是空的。
对异步任务的调用是异步完成的 ( doInBackground()
)。并且您正在将值保存到JSONdataWIthIDs
in onPostExecute()
。因此,您只能在异步任务完成后访问 ID。
如何将数据存储到数组中?
数据已经存储到 中的数组中onPostExecute()
。唯一的问题是您只能在onPostExecute()
调用后才能访问它。
添加回答
举报
0/150
提交
取消