问题 Android:AsyncTask的替代品?


对于我的应用程序,我为所有网络调用外部API创建了一个框架。我将所有内容都放在“服务”中,如: UserServiceMessageService 所以现在,当我想调用网络方法时,我无法在我的UI-Thread中执行此操作 Activity 所以我做了一个 AsyncTask 一切都很好=)

但现在我想要一些方法来执行该方法 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对此无益?


10954
2018-05-23 18:24


起源

我不清楚你在问什么,但是 IntentService 通常用作替代品 AsyncTask - pathfinderelite
我也不确定我是否正确理解你,但AsyncTask的替代品是加载器,实际上你应该更喜欢它们。 developer.android.com/guide/components/loaders.html - Bojan Kseneman
是的我很抱歉我不知道如何恰当地表达这一点所以搜索网络也没有用。我想再次解释一下:在“doInBackground”方法中,我不想明确地调用“userService.getUser”,因为还有许多其他方法和服务可以进行网络调用,因为我无法在主节点上执行它们/ UI线程我需要例如一个AsyncTask。但我只想为每种网络方法都有一个AsyncTask ... - cherry-wave
您可以创建自己的界面并将其传递给您的界面 通用  Asynctask。我建议你查一下 改造 形式广场或 齐射 根据这篇文章,谷歌网络运营的网络运营速度更快 instructure.github.io/blog/2013/12/09/volley-vs-retrofit - M090009
嗯我不知道如何使用我的网络框架(这个框架只知道所有的URL并解析好的对象中的JSON以返回我的android应用程序) - cherry-wave


答案:


有很多AsyncTask替代品:

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

和加上针 - Android的多线程库

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


6
2018-05-01 01:46





也许你可以使用第三方库 改造 如果你使用图像我强烈建议 毕加索


4
2018-05-23 18:28





请记住,Android有线程和AsyncTasks的限制。

您可以使用2个库来执行AsyncTasks的相同工作:

1)排球 - > http://www.androidhive.info/2014/05/android-working-with-volley-library-1/

2)LoopJ - > http://loopj.com/android-async-http/

UPDATE

我真的推荐Retrofit 2。 http://square.github.io/retrofit/

祝你好运。

问候,

Uilton。


4
2018-05-25 09:26





如果您不喜欢第三方库并且更喜欢具有简单性和良好文档和支持的库, 装载机 是最好的选择。

令我们高兴的是,AsyncTaskLoader(Loaders的子类)执行与AsyncTask相同的功能,但更好,也可以更轻松地处理Activity配置更改。最好的是它在Fragments和Activities的生命周期内运行。

有关更多信息和子类,请检查此 文件


2
2017-11-06 08:36





应该使用加载器而不是直接使用Async任务。特定的Loader API用于特定操作,例如在sqlite数据库中执行转换等。


0
2018-04-05 12:36





RxJAVA是最好的选择

替代Asynctask进行Web服务调用,文件上传,文件下载等 Android快速网络库

对于其他情况 你可以使用以下 方法

 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() {}
    }

0
2018-06-24 10:19





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


-1
2018-05-23 18:57



我已经使用排球进行数千条记录调用,但它会让应用程序挂起/滞后。所以,我不喜欢排球以获得更多的响应数据。其他排球很棒。 - Naitik
现在我要使用LoopJ - > loopj.com/android-async-http - Naitik