2014-10-29 63 views
2

熙傢伙,的AsyncTask,插入,在Android中選擇執行的順序錯誤

我目前正在調試從一個數據庫retreives某些數據的應用程序,它西港島線在ListView後顯示。然而,它使用額外的方法在日期對這些結果進行排序,並將其顯示在名爲「Gesorteerd op datum」的類別中,其中包含子月份與其中的月份。例如:

Link screenshot because i miss 1 reputation to upload a image.

正如你可以看到打開的部分是靜態的,我使用的一個功能,選擇所有一定的時間週期之間的數據,然後將這些整理數月,並插入這些回數據庫讓事情儘可能動態(我也插入了定製的「Gesorteerd op Datum」和幾個月)。然而,當第一次使用這個應用程序,你打開這個片段時,「基準上的Gesorteerd」部分完全缺失。然而,按回去,然後再次進入那裏。

所以問題是,插入需要更長的時間才能完成,然後選擇和顯示所有列表項的功能。我試着用2個Asynctasks修復這個問題。

第一個asynctask:DoInBackground函數插入「Gesorteerd op datum」和al子月,它使用一個偵聽器,以便它在下一個事情完成之前不會做任何事情。然後onPostExecute運行一個顯示分類的函數。但是在這裏它已經出錯了,因爲「gesorteerd op datum」沒有被添加到數組中,以後用於顯示列表視圖。

第二個Asynctask:DoInBackground使用一個函數根據日期獲取並排序事件,然後插入它們。然後onPostexecute獲取包括「gesorteerd op datum」事件在內的所有事件,並在下面的列表視圖中顯示它們。如上所述,它沒有做它應該做的事情。

任何人都知道它出錯的地方?因爲在閱讀Asynctask文檔之後,我明白它在第一次插入完成後不應該加載分類。但它仍然會提早加載它們。

/* 
* Insert Static categories into database. 
* Easier to manipulate and prevents unnecessary code. 
*/ 
class Static extends AsyncTask<Object, Object, Object>{  
    @Override 
    protected Object doInBackground(Object... params) { 
     // TODO Auto-generated method stub 
     insertStaticData(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Object result) 
    { 
     getAllStaticData(); 
     new async().execute(); 
    } 
} 

/* 
* Insert Static categories into database. 
* Easier to manipulate and prevents unnecessary code. 
*/ 
class async extends AsyncTask<Object, Object, Object>{  

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     toggleLoadingView(mLoading, mExpandableListView, mRootView, true); 
    } 

    @Override 
    protected Object doInBackground(Object... params) { 
     // TODO Auto-generated method stub 
     if (sCurrentRadius != 0 && mLastLocation != null) { 
      loadCursor(mLastLocation, sCurrentRadius); 
     } else{ 
      loadCursor(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Object result) 
    { 
     getAllDynamicData(); 
    } 
} 

這些是我的Asyncs編輯後,從下面的建議。他們現在顯示他們,但它不會顯示它應該顯示的所有月份。當我重新加載它顯示它們。

+0

爲什麼不在運行select之前,在初始AsyncTask的onPostExecute中選擇數據,這樣你知道線程已經完成? – LokiSinclair 2014-10-29 09:44:11

+0

你是什麼意思?因爲我最初創建靜態分類並插入它們。然後在onPostExecute它只獲取Categorys。之後,我開始第二次異步獲取和排序日期的事件,然後在onPostExecute我顯示在分類事件。 – 2014-10-29 09:48:35

+0

我明白你的意思了。我嘗試過,但不會顯示。 – 2014-10-29 10:16:32

回答

2

骯髒的解決方案:

讓X秒的處理程序和後延,因此刀片將完成。 X可能會影響您插入的內容以及您必須做的事情。

/* 
    * Run the Async and then after a delay load the listview needed. 
    */ 
    new Static().execute(); 

    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
    @Override 
     public void run() { 
      if (sCurrentRadius != 0 && mLastLocation != null) { 
       loadCursor(mLastLocation, sCurrentRadius); 
      } else{ 
       loadCursor(); 
      } 
     } 
    }, 4000); 

/* 
    * Insert Static categories into database. 
    * Easier to manipulate and prevents unnecessary code. 
    */ 
    class Static extends AsyncTask<Object, Object, Object>{  

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      toggleLoadingView(mLoading, mExpandableListView, mRootView, true); 
     } 

     @Override 
     protected Object doInBackground(Object... params) { 
      // TODO Auto-generated method stub 
      insertStaticData(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Object result) 
     { 
      getAllStaticData(); 
     } 
    }