Android: альтернативы AsyncTask?
для моего приложения я сделал фреймворк для всех сетевых вызовов внешнего API. Я положил все в "услуги", как:UserService
, MessageService
etc. Поэтому теперь, когда я хочу вызвать сетевой метод, я не могу сделать это в UI-потоке my Activity
поэтому я сделал AsyncTask
и все было просто замечательно =)
но теперь я хочу что-то вроде предоставления метода для выполнения AsyncTask
поэтому мне не нужно писать AsyncTask
для каждого метода моей сети-framework. Так что вместо того, чтобы иметь что-то вроде это:
public class NetworkTask extends AsyncTask<UserService, Void, Void> {
@Override
protected Void doInBackground(UserService... params) {
UserService userService = params[0];
userService.getUser();
return null;
}
}
Я хочу что-то более "абстрактные" так AsyncTask
не нужно знать метод" getUser"? Но я не могу придумать, как это сделать... Может быть, AsyncTask все равно не подходит для этого?
7 ответов
возможно, вы можете использовать стороннюю библиотеку, такую как модернизация Если вы работаете с изображениями, я настоятельно рекомендую Пикассо
помните, что Android имеет ограничение потоков и AsyncTasks.
вы можете использовать 2 библиотеки для выполнения той же работы AsyncTasks:
1) залп ->http://www.androidhive.info/2014/05/android-working-with-volley-library-1/
2) LoopJ -> http://loopj.com/android-async-http/
обновление
Я действительно рекомендую Retrofit 2. http://square.github.io/retrofit/
хорошее удачи в выборе.
с уважением,
Uilton.
Если вы не предпочитаете сторонние библиотеки и предпочитаете библиотеку с простотой и хорошей документацией и поддержкой, погрузчики самый лучший выбор.
для нашего удовольствия AsyncTaskLoader (подкласс загрузчиков) выполняет ту же функцию, что и AsyncTask, но лучше, а также может легче обрабатывать изменения конфигурации активности.И самое лучшее, что он ведет себя в рамках жизненного цикла фрагментов и деятельности.
для получения дополнительной информации и подклассы пожалуйста проверьте это документация.
погрузчики должны использоваться вместо прямого использования асинхронных задач. Существуют определенные API загрузчика для определенных операций, таких как выполнение транзакций в базе данных sqlite и т. д.
RxJAVA-лучший вариант
альтернатива Asynctask для вызова веб-службы, загрузки файлов, загрузки файлов Android Быстрая Сеть Lib
в другом случае вы можете использовать следующие метод
Disposable d = Observable.fromCallable(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
// will run in background thread (same as doinBackground)
return postParam;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<HashMap<String, String>>() {
@Override
public void accept(final HashMap<String, String> data) throws Exception {
// will run in UI thread. write down code for on PostExecute
}
});
// write down code for on preExecute
DisposableManager.add(d);
/ / dispose object
@Override
protected void onDestroy() {
super.onDestroy();
DisposableManager.dispose();
}
// Dispose manager class
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
public class DisposableManager {
private static CompositeDisposable compositeDisposable;
public static void add(Disposable disposable) {
getCompositeDisposable().add(disposable);
}
public static void dispose() {
getCompositeDisposable().dispose();
}
private static CompositeDisposable getCompositeDisposable() {
if (compositeDisposable == null || compositeDisposable.isDisposed()) {
compositeDisposable = new CompositeDisposable();
}
return compositeDisposable;
}
private DisposableManager() {}
}
вы можете использовать библиотеку Volley, которая работает в фоновом потоке и дает вам контроль над основным потоком, когда все будет сделано.