猿问

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

我正在尝试从美国农业部数据库中获取食品的 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();

}


SMILET
浏览 142回答 2
2回答

临摹微笑

onPostExecute 是执行流从工作线程(即支持 AsyncTask)返回到 UI 线程的地方。您的日志行:&nbsp;&nbsp;&nbsp;Log.i("TAG",&nbsp;"SONdataWIthIDs&nbsp;size:&nbsp;"&nbsp;+&nbsp;JSONdataWIthIDs.size());发生在 UI 线程中,并且此时与工作线程并行运行。所以结果不可用

料青山看我应如是

问题很简单。该Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());语句在onPostExecute().&nbsp;所以JSONdataWIthIDs是空的。对异步任务的调用是异步完成的 (&nbsp;doInBackground())。并且您正在将值保存到JSONdataWIthIDsin&nbsp;onPostExecute()。因此,您只能在异步任务完成后访问 ID。如何将数据存储到数组中?数据已经存储到 中的数组中onPostExecute()。唯一的问题是您只能在onPostExecute()调用后才能访问它。
随时随地看视频慕课网APP

相关分类

Java
我要回答