我有下一个奇怪的问题,我正在尝试用后台的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()
被解雇之前,请帮助我!
答案 0 :(得分:0)
我没有权限发表评论,所以我会在这里发布:
您ordersDatabase
,cityList
或activeOrders
上没有听众?
答案 1 :(得分:0)
从sentinel = object()
value = my_dict.get(key, sentinel)
if value is not sentinel:
# Do something with value
返回任何内容的AsyncTask
(并且不会通过私人成员与doInBackground()
进行通信)始终存在疑问。
你的onPostExecute()
中有很多副作用,这种东西很难调试。例如,您可以添加到AsyncTask
和cityList
,而不会显示实际情况。可能这些是附加到某些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