2012-02-27 6 views
3

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

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

+0

для вашего задач лучше использовать готовые готовые библиотеки: http://code.google.com/p/libs-for-android/wiki/ImageLoader – Yahor10

+0

Спасибо, я уже использую imageloader от googletv для моего приложения: D –

ответ

2

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

  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 (вроде концепции DIY Spring), для тестирования компонента пользовательского интерфейса без учета того, как реализуется реальная бизнес-логика.

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

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

+0

Может быть, я не объясню четко. Мое приложение как-то любит Android Market. Например: подробно о деятельности приложения, он показывает скриншоты приложений, приложения той же категории, те же приложения-поставщики, рекомендуют приложения. ** Поэтому я создаю 4 asynctasks для получения данных или помещаю 4 функции в одну асинтезу и обновляю пользовательский интерфейс вызовом publishProgress **. Какой способ более эффективен. У меня были разные модели для песни, приложения, истории ...и поддельные данные: D –

+0

Лично я предпочитаю одиночную AsyncTask с publishProgress, если все ваши трудоемкие задачи обрабатываются в фоновом потоке, используйте один из них достаточно и эффективнее, чтобы использовать несколько из них. – yorkw

1

я реализовал такие виды задачи в одном 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; 
} 
Смежные вопросы