Существует еще один очень удобный способ решения этой проблемы - использование возможностей параллелизма rxJava.Вы можете выполнить любую задачу в фоновом режиме и опубликовать результаты в основном потоке очень удобным способом, поэтому эти результаты будут переданы в цепочку обработки.
Первый проверенный ответ - использовать AsynTask.Да, это решение, но в настоящее время оно устарело, потому что вокруг появились новые инструменты.
String getUrl() {
return "SomeUrl";
}
private Object makeCallParseResponse(String url) {
return null;
//
}
private void processResponse(Object o) {
}
Метод getUrl предоставляет URL-адрес, и он будет выполняться в главном потоке.
makeCallParseResponse (..) - выполняет фактическую работу
processResponse (..) - обрабатывает результат в основном потоке.
Код для асинхронного выполнения будет выглядеть следующим образом:
rx.Observable.defer(new Func0<rx.Observable<String>>() {
@Override
public rx.Observable<String> call() {
return rx.Observable.just(getUrl());
}
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.map(new Func1<String, Object>() {
@Override
public Object call(final String s) {
return makeCallParseResponse(s);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
processResponse(o);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// Process error here, it will be posted on
// the main thread
}
});
По сравнению с AsyncTask этот метод позволяет переключать планировщики произвольное количество раз (скажем, получать данные из одного планировщика и обрабатывать эти данные в другом (например, Scheduler.computation ()). Вы также можете определить свой собственныйпланировщики.
Чтобы использовать эту библиотеку, включите в файл build.gradle следующие строки:
compile 'io.reactivex:rxjava:1.1.5'
compile 'io.reactivex:rxandroid:1.2.0'
Последняя зависимость включает поддержку планировщика .mainThread ().
Существует отличная книга для rx-java .