android - 将此 AsyncTask 转换为 RxAndroid?

标签 android android-asynctask rx-java rx-android

对于 Rx 来说有点陌生,所以我正在寻找一些关于将以下 AsyncTask 转换为 Rx 的帮助,希望这样我可以使用我已经知道可以做某事的代码来更多地可视化 Rx。我发现了一些其他一些相关的答案,但其中很多都不是网络请求,并且许多使用不同的运算符来获得不同的答案,所以我有点困惑。

这是AsyncTask:

public class BackgroundStuff extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {

        UserAgent myUserAgent = UserAgent.of("xxx:xxxx:xxx");

        RedditClient redditClient = new RedditClient(myUserAgent);
        Credentials credentials = Credentials.userlessApp("xxxxxxxx", UUID.randomUUID());
        OAuthData authData = null;
        try {
            authData = redditClient.getOAuthHelper().easyAuth(credentials);
            redditClient.authenticate(authData);
        } catch (OAuthException e) {
            e.printStackTrace();
        }

        SubredditPaginator sp = new SubredditPaginator(redditClient);

        sp.setLimit(7);
        sp.setSorting(Sorting.HOT);
        sp.setTimePeriod(TimePeriod.DAY);

        sp.setSubreddit("pics");

        sp.next(true);
        Listing<Submission> list = sp.getCurrentListing();

        Submission sub = list.get(1);
        for (Submission submission : list) {
            Log.d("test", "title: " + submission.getTitle());
        }
        Submission sub2 = redditClient.getSubmission(sub.getId());
        System.out.println(sub2.getComments().get(0).getComment().getBody());


        return null;
    }
}

作为引用,这会向 Reddit 进行身份验证,然后从特定的 Reddit 子版 block 获取一些结果。

我知道我需要一个Observable,然后.suscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()),但不确定如何使可观察的。

最佳答案

将其包装在函数中:

    Void doSomething(){
    UserAgent myUserAgent = UserAgent.of("xxx:xxxx:xxx");

    RedditClient redditClient = new RedditClient(myUserAgent);
    Credentials credentials = Credentials.userlessApp("xxxxxxxx", UUID.randomUUID());
    OAuthData authData = null;
    try {
        authData = redditClient.getOAuthHelper().easyAuth(credentials);
        redditClient.authenticate(authData);
    } catch (OAuthException e) {
        e.printStackTrace();
    }

    SubredditPaginator sp = new SubredditPaginator(redditClient);

    sp.setLimit(7);
    sp.setSorting(Sorting.HOT);
    sp.setTimePeriod(TimePeriod.DAY);

    sp.setSubreddit("pics");

    sp.next(true);
    Listing<Submission> list = sp.getCurrentListing();

    Submission sub = list.get(1);
    for (Submission submission : list) {
        Log.d("test", "title: " + submission.getTitle());
    }
    Submission sub2 = redditClient.getSubmission(sub.getId());
    System.out.println(sub2.getComments().get(0).getComment().getBody());


    return null;
    }

将其包装在可观察对象中:

Observable.just(doSomething);

将其包装在延迟中,以便仅当有人订阅它时它才会运行:

Observable<Void> doSomethingObservable = Observable.defer(()-> Observable.just(doSomething))

使用subscribeOn和observeOn决定它将在哪里运行,并订阅它以使其运行:

doSomethingObservable
.suscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread()).subscribe();

关于android - 将此 AsyncTask 转换为 RxAndroid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35167708/

相关文章:

android - Android SDK 1.5和2.0在渲染方面有什么区别?

php - 来自 PHP 的无效 JSON 响应?

android - 致命异常 asyncTask #1 主机可能不为空

java - RxJava : Chaining Observables w/Builder object

java - 一个主题的多个订阅者。有订阅时打开,否则关闭

android - 如何在 Android 中实现分页 ListView

android - 如果应用程序在后台,则点击通知栏不会在 Activity 中收到消息

android - 在 Android 中制作文本转语音包装器

android - 对有延迟的 Rxjava 可观察对象进行单元测试

java - 从 PlaceHolderFragment : "' com. 执行 AsyncTask example.Activity.this' 无法从静态上下文引用”