0

我有一個應用程序使用標籤和片段。在我的一個選項卡上,我有一個包含頁眉視圖和頁腳視圖的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()方法中。但我想明白爲什麼會發生這種情況,如果我能以某種方式修復它,以保持動畫方法在那裏。 } 返回動畫; }

+0

您是否將選項卡切換爲包含空列表的視圖,還是將視圖切換爲包含空列表的視圖? –

+0

請將您的代碼 –

+0

@ M.Palsich遠離包含空列表的視圖。我切換到的標籤非常簡單,asynctask可以提取聯繫人信息並查看並顯示它。當我切換到任何選項卡時發生錯誤。 – Phil

回答

1

由於您正在您的應用中執行後臺任務。不能保證用戶將保持在同一屏幕上,直到任務完成,因此如果用戶導航到其他屏幕或在任務完成之前按下主頁按鈕;你的片段與活動分開。因此,請務必確保您的活動附有片段。嘗試用

if (isAdded) { 
//Do your UI stuff here 
} 

檢查的更多詳細信息,請訪問此鏈接:

Fragment MyFragment not attached to Activity

+0

謝謝你的建議,我會試一試。但是,爲什麼只有當我的listview數據爲空時纔會出現此錯誤? – Phil

+0

- 如果您有時間我更新了我的問題。我發現是什麼導致了我的問題,但我不明白它爲什麼會這樣做。如果您有時間更新我的問題,請致電 – Phil

0

我不知道它爲你工作,因爲你不能顯示你的整個代碼,但它的工作對我來說,我只是在Recyler視圖片段中添加此方法

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (isVisibleToUser && mDataset.isEmpty()) { 

     Log.i(TAG, "start Asyc task "); 

     new LoadRssFeedsItems(getActivity()).execute(Constants.DW_HOME_PAGE_URL); 


    } 

}

+0

。我發現是什麼導致了我的問題,但我不明白它爲什麼會這樣做。 – Phil