【问题标题】:Android: Alternatives to AsyncTask?Android: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 应用程序)跨度>

标签: android android-asynctask frameworks


【解决方案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 的相同工作:

      1. 凌空->http://www.androidhive.info/2014/05/android-working-with-volley-library-1/

      2. 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,例如使用

          1. 执行者服务
          2. RxJava
          3. 可听的期货
          4. 使用 Kotlin 的 Courotines

          这是我的实现

          click the link below to see implementations

          【讨论】:

            【解决方案8】:

            您可以使用 Volley 库,它在后台线程上工作,并在事情完成后让您控制回到主线程。

            【讨论】:

            • 我已经使用 volley 进行了数千条记录调用,但它让应用程序挂起/滞后。所以,对于更多的响应数据,我不喜欢凌空抽射。否则凌空是极好的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-08
            • 2012-01-25
            • 2011-01-01
            • 2011-10-24
            • 2011-05-31
            • 2023-03-21
            相关资源
            最近更新 更多