Android:AsyncTask 的替代品?

Posted

技术标签:

【中文标题】Android:AsyncTask 的替代品?【英文标题】:Android: Alternatives to AsyncTask? 【发布时间】:2015-08-05 15:00:14 【问题描述】:

对于我的应用,我为所有对外部 API 的网络调用创建了一个框架。我将所有内容都放在“服务”中,例如:UserServiceMessageService 等。所以现在当我想调用网络方法时,我无法在我的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 您可以根据您的要求使用任何数据类型【参考方案5】:

如果您不喜欢第三方库,而喜欢简单且文档和支持良好的库,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和线程池。 有知道这三个如何选择吗?

Android AsyncTask

如何在 android 中将 asynctask 代码更改为 rxandroid 代码?

android中的asynctask可不可以并行执行多个

AsyncTask 替代背景图像下载? (AsyncTask ---------已弃用)