对于我的应用程序,我为所有网络调用外部API创建了一个框架。我把所有东西都放在"服务"比如:UserService
,MessageService
等等所以现在当我想调用网络方法时,我无法在我的Activity
的UI-Thread中执行此操作,因此我创建了一个{ {1}},一切都很好=)
但现在我想要让方法执行到AsyncTask
,所以我不需要为我的网络框架的每个方法编写AsyncTask
。所以不要有这样的东西:
AsyncTask
我想要更多的东西&#34;抽象&#34;所以public class NetworkTask extends AsyncTask<UserService, Void, Void> {
@Override
protected Void doInBackground(UserService... params) {
UserService userService = params[0];
userService.getUser();
return null;
}
}
并不需要知道&#34; getUser&#34;方法?但我无法知道如何做到这一点......也许AsyncTask对此无益吗?
答案 0 :(得分:6)
有很多AsyncTask替代品:
并加上Needle - Android的多线程库
答案 1 :(得分:4)
答案 2 :(得分:4)
请记住,Android有线程限制和AsyncTasks。
您可以使用2个库来执行AsyncTasks的相同工作:
1)排球 - &gt; http://www.androidhive.info/2014/05/android-working-with-volley-library-1/2)LoopJ - &gt; http://loopj.com/android-async-http/
更新
我真的推荐Retrofit 2。 http://square.github.io/retrofit/
祝你好运。
此致
Uilton。
答案 3 :(得分:2)
如果您不喜欢第三方库并且更喜欢具有简单性和良好文档和支持的库,加载器是最佳选择。
令我们高兴的是,AsyncTaskLoader(Loaders的子类)执行与AsyncTask相同的功能,但更好,也可以更轻松地处理Activity配置更改。最好的是它在Fragments和Activities的生命周期内运行。
有关详细信息和子类,请查看documentation。
答案 4 :(得分:2)
RxJAVA是最佳选择
替代Asynctask用于Web服务调用,文件上传,文件下载为 Android Fast Networking Lib
对于其他情况 您可以使用以下method
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() {}
}
答案 5 :(得分:0)
应该使用加载程序而不是直接使用异步任务。特定的Loader API用于特定操作,例如在sqlite数据库中执行转换等。
答案 6 :(得分:0)
我为此发布了多种解决方案来替换异步任务,例如使用
这是我的实现
答案 7 :(得分:-1)
您可以使用Volley库,它可以在后台线程上工作,并在完成任务后让您控制回主线程。