2013-07-30 63 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