在onPostExecute触发之前显示数据

时间:2015-07-07 18:10:29

标签: java android android-asynctask

我有下一个奇怪的问题,我正在尝试用后台的JSON数据解析响应,因为有很多数据并且这样调用它:

protected AsyncTask<JSONObject, Void, Void> createParseTask() {

    return new AsyncTask<JSONObject, Void, Void>() {
        @Override
        protected Void doInBackground(JSONObject... jsonObjects) {
            parseResponse(jsonObjects[0]);
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            mProgressBar.setVisibility(View.GONE);
            if (!mEmpty) {
                if (swipeRefresh.isRefreshing()) {
                    swipeRefresh.setRefreshing(false);
                    mAdapter.notifyDataSetChanged();
                } else if(!mShowStored) {
                    mAdapter.notifyDataSetChanged();
                }
            } else if (mShowStored) {
                mProgressBar.setVisibility(View.GONE);
            } else {
                internetError.setVisibility(View.VISIBLE);
          internetError.setText(getActivity().getResources().getString(R.string.emptyRequestError));
            }

            if (!mShowStored) {
                checkData();
            }

        }
    };

}

parseResponse()方法写成如下:

protected void parseResponse(JSONObject response) {

    JSONArray jsonArray = null;
    JsonParser parser = new JsonParser();
    OrdersDatabase ordersDatabase = new OrdersDatabase(AppController.getAppContext());
    try {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(AppController.getAppContext());
        SharedPreferences.Editor editor = sp.edit();
        String dateTime = response.getString("serverDateTime");
        dateTime = dateTime.replace(":", "%3A");
        dateTime = dateTime.replace("+", "%2B");
        editor.putString("serverDateTime", dateTime);
        editor.apply();
        jsonArray = response.getJSONArray("updatedOrders");
        JSONArray active = response.getJSONArray("activeOrders");
        if (jsonArray.length() == 0 && active.length() == 0) {
            mEmpty = true;
        } else if (response.length() > 0 || jsonArray.length() > 0 && active.length() > 0) {
            for (int i = 0; i < jsonArray.length(); i++) {
                JsonElement jsonElement = new JsonParser().parse(String.valueOf(jsonArray.get(i)));
                JsonObject jsonObject = jsonElement.getAsJsonObject();

                String orderID = jsonObject.getAsJsonPrimitive("id").getAsString();

                if (!mShowStored) {
                    if (!ordersDatabase.checkOrder(orderID)) {
                        ordersDatabase.addOrderData(jsonObject.getAsJsonPrimitive("id").getAsString(), String.valueOf(jsonObject));
                    } else {
                        ordersDatabase.updateOrderData(jsonObject.getAsJsonPrimitive("id").getAsString(), String.valueOf(jsonObject));
                    }
                }
            }
            for (int i = 0; i < active.length(); i++) {
                JSONObject jsonObject = active.getJSONObject(i);
                String activeOrder = jsonObject.getString("id");
                activeOrders.add(activeOrder);
                if (ordersDatabase.checkOrder(activeOrder)) {
                    if (!TextUtils.isEmpty(activeOrder)) {
                        JsonObject jsonOrder = (JsonObject) parser.parse(ordersDatabase.getOrderData(activeOrder));
                        cityList.add(OrderData.fromJson(jsonOrder));
                    }
                }
            }

        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

所以我不知道怎么回事,但不知何故,在显示onPostExecute之前,RecyclerView中出现的数据是存在的,因为在post post中,进度条应该不可见,notifydatasetchange也应该出现在那里。但数据出现在进度条不可见且notifyDataSetChange()被解雇之前,请帮助我!

2 个答案:

答案 0 :(得分:0)

我没有权限发表评论,所以我会在这里发布: 您ordersDatabasecityListactiveOrders上没有听众?

答案 1 :(得分:0)

sentinel = object() value = my_dict.get(key, sentinel) if value is not sentinel: # Do something with value 返回任何内容的AsyncTask(并且不会通过私人成员与doInBackground()进行通信)始终存在疑问。

你的onPostExecute()中有很多副作用,这种东西很难调试。例如,您可以添加到AsyncTaskcityList,而不会显示实际情况。可能这些是附加到某些activeOrders的列表,并且添加到这些列表可能会触发附加到Adapter的{​​{1}}以重新绘制。如果是这种情况,您可以尝试在View上调用Adapter(延迟更新,直到您稍后再次手动调用setNotifyOnChange(false)。)

http://developer.android.com/reference/android/widget/ArrayAdapter.html#setNotifyOnChange(boolean)

一般情况下,如果您的mAdapter没有返回任何内容或以其他方式&#34;通信&#34;对于notifyDataSetChanged(),首先考虑AsyncTask是没有意义的。更好的是onPostExecute()不会产生任何副作用,而是返回已解析的数据,只将其添加到onPostExecute()中的doInBackground()cityList

多线程很棘手且activeOrders出现/试图让它变得更容易,有很多陷阱。我试图回答onPostExecute() here

的线程安全问题