2013-07-30 108 views
0

我有它的一些碎片的應用程序。在其中一個片段中,我經常調用db(大約4-5),但是當用戶與屏幕交互時,它們散佈在片段中的所有位置。例如,按下按鈕時,獲取所有類型爲b的記錄......等等。我知道我們應該在單獨的線程中優先執行所有數據庫操作,並且我知道AsyncTask以及它如何用於執行這個。異步任務來處理多個數據庫調用

我的問題是,因爲我在多個方法中調用了數據庫,創建一個新的異步任務只是爲了每次在分段中的不同位置需要數據庫調用時都沒有任何意義。有沒有一種方法可以在一個片段的不同位置使用一個乾淨而簡單的單個異步任務處理所有這些任務來調用多個db調用?

回答

2

怎麼是這樣的:

public interface DBRunnable { 
    public void executeDBTask(); 
    public void postExecuteDBTask(); 
} 

private class DBTask extends AsyncTask<DBRunnable, Void, DBRunnable> { 
    @Override 
    protected DBRunnable doInBackground(DBRunnable...runnables) { 
     runnables[0].executeDBTask(); 
     return runnables[0]; 
    } 

    @Override 
    protected void onPostExecute(DBRunnable runnable) { 
     runnable.postExecuteDBTask(); 
    } 
} 

這將是這樣調用:

new DBTask().execute(new DBRunnable() { 
     @Override 
     public void executeDBTask() { 
      // execute your db code here 
     } 

     @Override 
     public void postExecuteDBTask() { 
      // run your post execute code here 
     } 
    }); 

的DBRunnables可以保持在一個地方讓代碼更容易閱讀和維護。

+0

一個問題,如果我想有得到基於所取得的數據庫調用執行不同的任務是什麼。我的意思是我想要不同的OnPostExecute異步調用,如果我讀一條記錄vs寫一條記錄 –

+0

我修改我的示例以顯示如何使用onPostExecute。如果您希望能夠同時運行多個DBRunnable,則需要將它們傳遞給DBTask的構造函數,以便doInBackground()和onPostExecute()可以遍歷可運行子集。如果你這樣做,AsyncTask的參數和結果已經過時並且可以是無效的。 –

+0

Sory再次打開此帖,但這是最合適的答案,所以在這裏。這是什麼runnables [0] .executeDBTask();這是什麼意思?你會如何做到這一點? – JoaoFilipeClementeMartins