2013-08-21 3 views
3

Я относительно новый Android-разработчик и сейчас работаю над приложением, которое делает много звонков на веб-службу RESTful.Лучший способ организовать AsyncTask

Я делаю каждый звонок в asyncTask, но в некоторых файлах количество различных задач async у меня есть подходы 15. Сейчас у меня есть все как частные классы внутри моего класса активности. Как я могу организовать их лучше (т.е. помещать их в отдельные файлы), все еще имея возможность обновлять пользовательский интерфейс. Я думал о передаче context в конструктор каждого asyncTask, но мне было просто интересно, была ли лучшая практика/лучше путь.

Спасибо!

+2

Вы должны используйте библиотеку наподобие Volley вместо нескольких асинтетов для сетевых запросов. – tbruyelle

+0

Я согласен с помощником выше, или если вы хотите придерживаться AsyncTasks, используйте исполнителя ThreadPool! – Pavlos

+0

AsyncTasks может быть выполнен в [исполнителе пула потоков] (http://developer.android.com/reference/android/os/AsyncTask.html#THREAD_POOL_EXECUTOR). Поскольку он является общедоступным, вы можете (ab) использовать его для других вещей. – zapl

ответ

1

Вместо того, чтобы использовать так много классов для разных типов AsyncTask, я предлагаю вам использовать эту библиотеку

вы можете посмотреть на здесь

http://loopj.com/android-async-http/

ваш код станет очень очень меньше, вместо того, чтобы объявить это может AsyncTask отдельно писать большую часть кода, вы можете просто использовать 4 строки кода

AsyncHttpClient client = new AsyncHttpClient(); 
client.get("http://www.google.com", new AsyncHttpResponseHandler() { 
    @Override 
    public void onSuccess(String response) { 
     System.out.println(response); 
     } 
}); 

Я очень эффективен в получении ответа очень быстро.

Я надеюсь, что это поможет вам. :)

+0

Именно то, что я искал. Спасибо! –

+0

ура :) - просто просмотрите производительность 2 секунды, чтобы загрузить данные, которые есть. –

1

Передача в качестве параметра конструктора звучит как хороший план для меня. В основном то же самое происходит, когда вы объявляете их внутренним классом.

Но имейте в виду, что есть некоторые недостатки использования AsyncTasks для загрузки данных. После запуска они будут продолжать работать, даже если активность уже закрыта и будет содержать ссылку на вашу деятельность (поэтому она не может быть собрана мусором).

Возможно, вы захотите изучить другие понятия, такие как загрузчики.

1

Рассмотрите возможность использования библиотеки для упрощения базы кода. Я написал droidQuery, который, среди прочего, может быть использован для упрощения AsyncTask. Например, чтобы получить JSON данных из example.com, и иметь доступ к связи после этого, вы можете сделать это:

$.ajax(new AjaxOptions().url("http://www.example.com") 
         .context(this) 
         .type("GET") 
         .dataType("json") 
         .success(new Function() { 
          @Override 
          public void invoke($ droidQuery, Object... params) { 
           JSONObject json = (JSONObject) params[0]; 
           Context context = droidQuery.context(); 
           //TODO: 
          } 
         }) 
         .error(new Function() { 
          @Override 
          public void invoke($ droidQuery, Object... params) { 
           AjaxError error = (AjaxError) params[0]; 
           Log.e("Ajax", "Error " + error.status + ": " + error.reason); 
          } 
         })); 

Для большого количества различных запросов, которые вы называете много, вы также можете создавать экземпляры AjaxOptions для последующего использования использования, которые имеют различные URL-адреса, типы, типы данных и т.д.:

Map<String, AjaxOptions> requests = new HashMap<String, AjaxOptions>(); 
//add the example above: 
requests.put("example", new AjaxOptions().url("http://www.example.com") 
             .context(this) 
             .type("GET") 
             .dataType("json") 
             .success(new Function() { 
              @Override 
              public void invoke($ droidQuery, Object... params) { 
               JSONObject json = (JSONObject) params[0]; 
               Context context = droidQuery.context(); 
               //TODO: 
              } 
             }) 
             .error(new Function() { 
              @Override 
              public void invoke($ droidQuery, Object... params) { 
               AjaxError error = (AjaxError) params[0]; 
               Log.e("Ajax", "Error " + error.status + ": " + error.reason); 
              } 
             })); 

потом, просто выполнить эту задачу по телефону:

$.ajax(requests.get("example")); 
+0

'.context (this) ', вероятно, должен быть контекстом приложения. Хранение ссылок на контекст активности является плохим, если только оно используется только во время жизни активности. Асинхронные вещи, как правило, продолжают ссылаться на них. – zapl

+2

@zapl, этот контекстный объект также не нужен, но больше удобен. Без него параметр 'droidQuery' будет пустым. – Phil

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