Android:AsyncTask 的替代品?
Posted
技术标签:
【中文标题】Android:AsyncTask 的替代品?【英文标题】:Android: Alternatives to AsyncTask? 【发布时间】:2015-08-05 15:00:14 【问题描述】:对于我的应用,我为所有对外部 API 的网络调用创建了一个框架。我将所有内容都放在“服务”中,例如:UserService
、MessageService
等。所以现在当我想调用网络方法时,我无法在我的Activity
的 UI 线程中执行此操作,所以我做了一个 @987654326 @ 一切都很好 =)
但现在我想要将执行方法提供给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 无论如何都不适合这个?
【问题讨论】:
我不太清楚你在问什么,但IntentService
通常用作AsyncTask
的替代品
我也不确定我是否理解正确,但是 AsyncTask 的替代品是加载器,实际上你应该更喜欢它们。 developer.android.com/guide/components/loaders.html
是的,很抱歉,我不知道如何正确表达这一点,所以搜索网络也没有帮助。我想再次解释一下:在“doInBackground”方法中,我不想显式调用“userService.getUser”,因为还有许多其他方法和服务可以进行网络调用,而且我无法在 Main 上执行它们/UI 线程我需要例如一个异步任务。但我只想为每种网络方法设置一个 AsyncTask...
您可以创建自己的界面并将其传递给您的 Generic Asynctask
。我建议您检查 Retrofit form square 或 google 的 Volley 进行网络操作,根据本文instructure.github.io/blog/2013/12/09/volley-vs-retrofit,它们的网络操作速度更快
嗯,我不明白如何使用我的网络框架来实现这一点(这个框架只会知道所有的 url 并在 nice Objects 中解析 JSON 以返回到我的 android 应用程序)跨度>
【参考方案1】:
有很多 AsyncTask 替代方案:
https://android-arsenal.com/tag/9
and plus Needle - 适用于 Android 的多线程库
http://zsoltsafrany.github.io/needle/
【讨论】:
【参考方案2】:也许您可以使用像Retrofit 这样的第三方库 如果您使用图片,我强烈建议您使用picasso
【讨论】:
【参考方案3】:请记住,Android 对线程和 AsyncTask 有限制。
您可以使用 2 个库来完成 AsyncTasks 的相同工作:
凌空->http://www.androidhive.info/2014/05/android-working-with-volley-library-1/
LoopJ -> http://loopj.com/android-async-http/
更新:
我真的推荐 Retrofit 2。 http://square.github.io/retrofit/
【讨论】:
【参考方案4】:RxJAVA 是最佳选择
Web 服务调用、文件上传、文件下载的 Asynctask 的替代方案是 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()
【讨论】:
这里不固定使用 HashMap如果您不喜欢第三方库,而喜欢简单且文档和支持良好的库,Loaders 是最佳选择。
令我们高兴的是,AsyncTaskLoader(Loaders 的子类)执行与 AsyncTask 相同的功能,但更好,还可以更轻松地处理 Activity 配置更改。最好的是它在 Fragment 和 Activity 的生命周期内运行。
有关更多信息和子类,请查看此documentation。
【讨论】:
只是一个旁注。从 API 28 开始,它已被弃用。【参考方案6】:应该使用加载器而不是直接使用异步任务。有特定的 Loader API 用于特定操作,例如在 sqlite 数据库中执行转换等。
【讨论】:
【参考方案7】:我为此发了帖子,有多种解决方案可以替换 asynctask,例如使用
-
执行者服务
RxJava
可听的期货
使用 Kotlin 的 Courotines
这是我的实现
click the link below to see implementations
【讨论】:
【参考方案8】:您可以使用 Volley 库,它在后台线程上工作,并在事情完成后让您控制回到主线程。
【讨论】:
我已经使用 volley 进行了数千条记录调用,但它让应用程序挂起/滞后。所以,对于更多的响应数据,我不喜欢凌空抽射。否则凌空是极好的。以上是关于Android:AsyncTask 的替代品?的主要内容,如果未能解决你的问题,请参考以下文章
AsyncTask 从 Android R 中弃用。任何替代代码?
Android 对线程封装了:AsyncTask, HandlerThread和线程池。 有知道这三个如何选择吗?