java - 如何存储来自 OnPostExecute() 的数据?
问题描述
我正在尝试从 USDA 数据库中获取食物的 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();
}
解决方案
onPostExecute 是执行流程从工作线程(即支持 AsyncTask)返回到 UI 线程的地方。您的日志行:
Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());
发生在 UI 线程中,并且此时与工作线程并行运行。所以结果不可用
推荐阅读
- c# - Microsoft SQL Server:插入列表问题;混淆了列表
- c# - 如何使用 REGEX C# 查找 LinkedIn 用户的 Web 链接
- c++ - 无法通过 OpenCV 和 C++ 获得我的网络摄像头支持的最大 30 fps
- javascript - 为什么我的 setInterval 函数在我的对象中不起作用?
- html - 在元素上指定尺寸并以 A4 纸格式显示页面
- sql - 如果外键不存在,则将该字段设置为 NULL
- c++ - 如何创建具有唯一名称的文件?
- java - 如何在 Javers 中更改 commitMetadata 中的作者字段
- spring - 测试休息端点 - Camel 3 + Spring Boot
- javascript - 如何将带有 npm 'docx' 包的图像添加到 word 文档?