对于我的应用程序,我为所有网络调用外部API创建了一个框架。我将所有内容都放在“服务”中,如: UserService
, MessageService
所以现在,当我想调用网络方法时,我无法在我的UI-Thread中执行此操作 Activity
所以我做了一个 AsyncTask
一切都很好=)
但现在我想要一些方法来执行该方法 AsyncTask
所以我不需要写一个 AsyncTask
对于我的网络框架的每个方法。所以不要有这样的东西:
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对此无益?
也许你可以使用第三方库 改造
如果你使用图像我强烈建议 毕加索
如果您不喜欢第三方库并且更喜欢具有简单性和良好文档和支持的库, 装载机 是最好的选择。
令我们高兴的是,AsyncTaskLoader(Loaders的子类)执行与AsyncTask相同的功能,但更好,也可以更轻松地处理Activity配置更改。最好的是它在Fragments和Activities的生命周期内运行。
有关更多信息和子类,请检查此 文件。
应该使用加载器而不是直接使用Async任务。特定的Loader API用于特定操作,例如在sqlite数据库中执行转换等。
RxJAVA是最好的选择
替代Asynctask进行Web服务调用,文件上传,文件下载等
Android快速网络库
对于其他情况
你可以使用以下 方法
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);
//处置对象
@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库,它可以在后台线程上工作,并在完成任务后让您控制回主线程。