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 ответов


существует множество альтернатив AsyncTask:

https://android-arsenal.com/tag/9

и плюс игла-многопоточная библиотека для Android

http://zsoltsafrany.github.io/needle/


возможно, вы можете использовать стороннюю библиотеку, такую как модернизация Если вы работаете с изображениями, я настоятельно рекомендую Пикассо


помните, что 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, которая работает в фоновом потоке и дает вам контроль над основным потоком, когда все будет сделано.