2013-07-30 2 views
0

У меня есть приложение с некоторыми фрагментами в нем. В одном из этих фрагментов я делаю частые звонки в db (около 4-5), но они засоряются повсюду в фрагменте, когда пользователь взаимодействует с экраном. Например, когда нажата кнопка, выберите все записи типа b ... и т. Д. Я знаю, что мы должны делать все операции с базами данных, предпочтительными в отдельном потоке, и я знаю об AsyncTask и как ее можно использовать это.Задача Async для обработки нескольких вызовов db

Мой вопрос в том, что у меня есть вызовы в db более чем одним методом, на самом деле не имеет смысла создавать новую задачу async, чтобы каждый раз, когда я делал вызов db, мне нужно было в разных местах фрагмента. Есть ли способ сделать несколько вызовов db в разных местах фрагмента, используя чистую и простую реализацию одной задачи async, которая обрабатывает все это?

ответ

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

Один вопрос, что делать, если я хочу иметь разные задачи, которые выполняются на основе исходящего вызова db. Я имею в виду, что мне бы хотелось, чтобы разные вызовы aspcon OnPostExecute, если я прочитал запись, и записал запись –

+0

Я изменил свой пример, чтобы показать, как можно использовать onPostExecute. Если вы хотите иметь возможность запускать несколько DBRunnables за один раз, вам нужно передать их в конструкторе DBTask, чтобы и doInBackground(), и onPostExecute() могли прокручивать runnables. Если вы это сделаете, параметры и результаты AsyncTask устарели и могут быть Void. –

+0

Sory, чтобы снова открыть это сообщение, но это самый подходящий ответ, так что вот оно. Что это за runnables [0] .executeDBTask(); что это значит? и как бы вы это сделали? – JoaoFilipeClementeMartins

Смежные вопросы