我有一個應用程序使用標籤和片段。在我的一個選項卡上,我有一個包含頁眉視圖和頁腳視圖的ListView。Android - ListView爲空時AsyncTask錯誤?
列表中的項目是通過我使用AsyncTask獲得的XML源從我的數據庫中收集的。當我在列表中列出項目時,所有內容都按照原樣運行。但是,我注意到,當我沒有項目,並且我的列表視圖爲空時,當我嘗試切換選項卡時,出現下面的錯誤。
java.lang.IllegalStateException: Fragment Pending{3223f5a4} not attached to Activity
我叫myList.setAdapter(空),如果我的數據回來空的,這樣我至少看到我的名單頁眉/頁腳,但我還是評論它消除它作爲一種可能性,它炸彈在我身上。
這會發生什麼?再次,當我的數據在我的異想天開返回時,一切都完好無損。
我可以根據需要添加更多的代碼,但是想等一下,看看是否有人知道副手什麼會造成這種情況。
的AsyncTask引起的問題
private class GetMaintenanceRequestsPending extends AsyncTask<String, Integer, Integer>
{
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(getActivity(), "", getResources().getString(R.string.general_msg_please_wait));
}
@Override
protected Integer doInBackground(String... params) {
//First check if network is connected, if not take user to network error activity.
if(!NetworkStatus.getInstance(getActivity().getApplicationContext()).isOnline(getActivity().getApplicationContext())) {
return AppConstants.STATUS_NETWORK;
}
try {
getMaintenancePending(params[0],params[1]);
if (maintenancePendingData == null) {
return AppConstants.STATUS_ERROR;
} else {
return AppConstants.STATUS_SUCCESS;
}
} catch (Exception e) {
return AppConstants.STATUS_ERROR;
}
}
@Override
protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); }
@Override
protected void onPostExecute(Integer result) {
// NETWORK ERROR HAS OCCURRED - SHOW NETWORK ACTIVITY
if (result == AppConstants.STATUS_NETWORK) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
progressDialog.dismiss();
Intent networkError = new Intent(getActivity(), NetworkError.class);
networkError.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(networkError);
getActivity().finish();
}
}, 1000);
}
// ERROR OCCURRED
else if (result == AppConstants.STATUS_ERROR) {
progressDialog.dismiss();
alertDialog.showAlertDialog(getActivity(), getString(R.string.error), getString(R.string.error_connect), false, false);
}
else {
// SUCCESS!
layoutMaintenanceSwipeRefresh.setRefreshing(false);
Globals.refreshMaintenanceRequestData = false;
setupPendingRequests();
}
}
}
我不明白的是爲什麼會在我的AsyncTask東西反正觸發?它在標籤加載時被調用,並且我將關閉標籤,爲什麼它會再次被調用?
此外,AsyncTask onPostExecute方法的setupPendingRequests()方法確實被調用。一切都看起來像它應該......直到我嘗試切換標籤。然後它拋出錯誤。我注意到它有時會將WindowLeaked視爲錯誤,而其他時間則不涉及活動。
UPDATE 16年8月24日
所以我通過我的代碼去,並試圖刪除任何東西,我能想到的,將導致此錯誤。這是我發現的。在我的片段中,我使用下面的代碼在動畫完成後觸發我的UI工作(AsyncTask,並設置UI元素值)。當我的列表視圖爲空時,無論出於何種原因,這種方法是什麼導致我的問題。
//@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
Animation animation = super.onCreateAnimation(transit, enter, nextAnim);
final Boolean fragmentShown = enter;
if (animation == null && nextAnim != 0) {
animation = AnimationUtils.loadAnimation(getActivity(), nextAnim);
}
if (animation != null) {
if (getView() != null) {
getView().setLayerType(View.LAYER_TYPE_HARDWARE, null);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationEnd(Animation animation) {
getView().setLayerType(View.LAYER_TYPE_NONE, null);
if (fragmentShown) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setupFragment();
}
}, 200);
}
}
});
}
} else {
setupFragment();
從我的這種方法是如何工作的,當我打電話,如果(fragmentShown){...我的UI的東西}我等待片段的動畫完成,然後做我的工作的理解。我還檢查動畫是否爲空,然後沒有爲這個片段設置動畫並調用ui的東西。
當我的listview數據集爲空時,爲什麼這個方法會導致問題? 我不明白。我已經通過刪除這個方法來修復它,而是將我的setupFragment()
調用放入片段的onResume()方法中。但我想明白爲什麼會發生這種情況,如果我能以某種方式修復它,以保持動畫方法在那裏。 } 返回動畫; }
您是否將選項卡切換爲包含空列表的視圖,還是將視圖切換爲包含空列表的視圖? –
請將您的代碼 –
@ M.Palsich遠離包含空列表的視圖。我切換到的標籤非常簡單,asynctask可以提取聯繫人信息並查看並顯示它。當我切換到任何選項卡時發生錯誤。 – Phil