簡體   English   中英

如何存儲來自 OnPostExecute() 的數據?

[英]How can I store data from OnPostExecute()?

我正在嘗試從USDA數據庫中獲取食物的 ID 號。 我的問題是我可以獲取 JSON 數據,但我無法將其從OnPostCreate()函數中取出。 當我在OnPostCreate()中遍歷JSONdataWIthIDs時,所有數據都在那里。 但是當我嘗試在其他地方使用數據時,它是空的。 如何將數據存儲到數組中?

這是構造函數。

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 線程中,並且此時與工作線程並行運行。 所以結果不可用。

問題很簡單。 Log.i("TAG", "SONdataWIthIDs size: " + JSONdataWIthIDs.size()); 語句在onPostExecute()之前執行。 所以JSONdataWIthIDs是空的。

對異步任務的調用是異步完成的( doInBackground() )。 並且您將值保存到JSONdataWIthIDs onPostExecute()中的 JSONdataWIthIDs 。 所以你只能在異步任務完成后訪問 id。

如何將數據存儲到數組中?

數據已經存儲在onPostExecute()的數組中。 唯一的問題是只有在調用onPostExecute()之后才能訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM