首页 > 解决方案 > 如何存储来自 OnPostExecute() 的数据?

问题描述

我正在尝试从 USDA 数据库中获取食物的 ID 号。我的问题是我可以获取 JSON 数据,但我无法将其排除在OnPostCreate()功能之外。当我遍历所有数据时JSONdataWIthIDsOnPostCreate()但是当我尝试在其他地方使用数据时,它是空的。如何将数据存储到数组中?

这是构造函数。

  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();
}

标签: javaandroidmultithreading

解决方案


onPostExecute 是执行流程从工作线程(即支持 AsyncTask)返回到 UI 线程的地方。您的日志行:

   Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());

发生在 UI 线程中,并且此时与工作线程并行运行。所以结果不可用


推荐阅读