为了账号安全,请及时绑定邮箱和手机立即绑定

如何存储来自 OnPostExecute() 的数据?

如何存储来自 OnPostExecute() 的数据?

SMILET 2021-07-10 08:30:09
我正在尝试从美国农业部数据库中获取食品的 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 线程中,并且此时与工作线程并行运行。所以结果不可用


查看完整回答
反对 回复 2021-07-14
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

问题很简单。该Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());语句在onPostExecute(). 所以JSONdataWIthIDs是空的。

对异步任务的调用是异步完成的 ( doInBackground())。并且您正在将值保存到JSONdataWIthIDsin onPostExecute()。因此,您只能在异步任务完成后访问 ID。

如何将数据存储到数组中?

数据已经存储到 中的数组中onPostExecute()。唯一的问题是您只能在onPostExecute()调用后才能访问它。


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信