Как эффективно использовать Asynctask - PullRequest
3 голосов
/ 27 февраля 2012

Я новичок в Android. Я хочу спросить вас, ребята, об Asynctask. У меня есть активность отображает подробную информацию об элементе (приложение, песня, история ...). Требуется много связанных данных, таких как скриншоты, связанные приложения (песни, истории), ... Так что же является лучшим средством Asynctask? Создаю ли я одну асинхронную задачу для каждой задачи (например: 2 асинхронной задачи: 1 для получения снимков экрана, 1 для получения связанного элемента ...) или помещаю все в doInBackGround и публикую прогресс?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

С точки зрения ОО, бизнес-логика всегда должна быть изолирована от пользовательского интерфейса. Я бы изолировал и централизовал все свои бизнес-вызовы, такие как getSong (), getStore () и т. Д., В POJO и оставил мой класс активности только на манипулировании / рендеринге пользовательского интерфейса, вот как я это делаю:

  1. Определение интерфейса IBusinessDAO
  2. Определение RealBusinessDAO реализует IBusinessDAO
  3. Определить, что MockBusinessDAO реализует IBusinessDAO
  4. Позвоните IBusinessDAO.getSong (); внутри AsyncTask.doInBackground ()

    public class MyActivity extends Activity {
      IBusinessDAO businessDAO;
    
      ... ...
    
      private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        ... ...        
    
        protected void doInBackground(Void... params) {
          businessDAO.getSong();
        }
      }
    
      ... ...
    
      public void onCreate(Bundle savedInstanceState) {
        if (runInTest)
          businessDAO = new MockBusinessDAO();
        else
          businessDAO = new RealBusinessDAO();
    
        new myAsyncTask().execute();
      }
    
    }
    

Таким образом, в каждой из ваших реализаций AsyncTask среди различных Деятельностей ваш AsyncTask.doInBackgroud () будет простым и чистым, в результате чего ваш код будет более эффективным и обслуживаемым.

Это также помогает улучшить тестируемость кода, для модульного тестирования вашей бизнес-логики, поскольку это POJO, вы можете использовать только JUnit для написания своего тестового примера. Иногда мы хотим протестировать компонент пользовательского интерфейса, и нам неважно, как реализована основная бизнес-логика, например, моя бизнес-логика подключается к удаленному http-серверу, загружает некоторые данные json, я не хочу делать это каждый раз, когда просто Я хочу протестировать макет пользовательского интерфейса. В этой ситуации я могу легко изменить все свои действия, используя MockBusinessDAO (своего рода концепцию DI Spring), для тестирования компонента пользовательского интерфейса, не касаясь того, как реализована реальная бизнес-логика.

Наконец, это также улучшает возможность повторного использования вашего кода, поскольку ваш businesDAO не имеет ничего общего с Andriod, кроме классического POJO, кроме того, вам не нужно беспокоиться о параллелизме в вашей реализации BusinessDAO, так как все его методы будут вызываться внутри AsyncTask Метод .doInBackground ().

Надеюсь, что поможет.

1 голос
/ 07 мая 2012

Я реализовал такие задачи в одной AsyncTask

private void _initCommonAsyncTask(AsyncTaskName currentTaskName,
        String searchQuery) {
    CommonAsyncTask task = new CommonAsyncTask(currentTaskName, searchQuery);
    task.execute();
    taskReference = new WeakReference<CommonAsyncTask>(task);
}

/**
 * Asynchronous Task for different functionalities.
 * 
 */
private class CommonAsyncTask extends AsyncTask<Void, Void, Void> {
    private final String searchQuery;
    private AsyncTaskName currentTaskName;

    /**
     * Default constructor
     */
    public CommonAsyncTask(AsyncTaskName currentTaskName, String searchQuery) {
        super();
        this.searchQuery = searchQuery;
        this.currentTaskName = currentTaskName;
    }

    @Override
    protected void onPostExecute(Void result) {
        switch (currentTaskName) {
        case SEARCH:
            // Reinitialized the list view
            break; 
        case REFRESH:
            // Reinitialized the list view
            break;
        case LOAD_NEXT:
            // Reinitialized the list view
            break;
        default:
            break;
        }
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        switch (currentTaskName) {
        case SEARCH:
            // My searching stuff here
            break;
        case REFRESH:
            // my refreshing stuff here
            break;  
        case LOAD_NEXT:
            //my load next 50 orders here
            break;  
        default:
            break;
        }
        return null;
    }
}

Вы можете вызвать Asynctask используя

_initCommonAsyncTask(AsyncTaskName.SEARCH, searchQuery);

Определите свой список задач в перечислении как это

public enum AsyncTaskName {
    SEARCH, REFRESH, LOAD_NEXT;
}
...