如何从OnPostExecute()存储数据?

时间:2018-08-11 04:03:49

标签: java android multithreading

我正在尝试从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();
}

3 个答案:

答案 0 :(得分:2)

问题是AsyncTask正在异步运行自己的单独线程

步骤1。

要解决该问题,我建议创建一个布尔变量,并在doInBackground函数内部将其初始化为false(isTaskFinished = false;),并在onPostExecute内部将其设为

步骤2。

创建一个处理程序,以每秒钟监视一次此值(例如),如果该值为true,则表示任务已完成。现在,您可以安全地检索结果,因为它已经完成。

快乐编码

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

问题很简单。 Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size());语句在onPostExecute()之前执行。因此JSONdataWIthIDs为空。

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

  

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

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