Android:AsyncTask的替代品?

时间:2015-05-23 18:24:50

标签: android android-asynctask frameworks

对于我的应用程序,我为所有网络调用外部API创建了一个框架。我把所有东西都放在"服务"比如:UserServiceMessageService等等所以现在当我想调用网络方法时,我无法在我的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对此无益吗?

8 个答案:

答案 0 :(得分:6)

有很多AsyncTask替代品:

  

https://android-arsenal.com/tag/9

并加上Needle - Android的多线程库

  

http://zsoltsafrany.github.io/needle/

答案 1 :(得分:4)

也许您可以使用像Retrofit这样的第三方库 如果您使用图片,我强烈建议picasso

答案 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)

我为此发布了多种解决方案来替换异步任务,例如使用

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

这是我的实现

click the link below to see implementations

答案 7 :(得分:-1)

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