【问题标题】:Converting this AsyncTask to RxAndroid?将此 AsyncTask 转换为 RxAndroid?
【发布时间】:2016-02-03 02:58:20
【问题描述】:

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

这是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 进行身份验证,然后从特定的 subreddit 中获取一些结果。

我知道我需要一个Observable,然后是.suscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()),但我不知道如何使 observable。

【问题讨论】:

  • 这是我对类似问题的回答:stackoverflow.com/questions/34738038/…
  • @ReyPham 在你的例子中,我的网络请求会去哪里?另外,您的答案中的Observer 在哪里?我知道.subscribe() 应该接受Observer 作为参数,那么new Subscriber&lt;String&gt;() 在这种情况下会做什么?
  • 在我的例子中,你所有的工作都应该在doSomeWork()方法中实现(你的情况是你的网络请求)。此方法的结果稍后将由Observable.just(msg) 发出,然后由订阅者 使用。订阅者也是观察者。
  • 好的,我正在运行一些东西。因此,在您的示例中,doSomeWork() 返回一个存储在 msg 中的字符串,该字符串由 Observable 发出。假设我只想运行我所有的东西而不返回任何东西或对数据做任何事情?有没有捷径可以做到这一点?
  • 你可以只发出一个空对象或任何你想要的东西。但请务必订阅您的 Observable,否则包装后的代码将无法运行。

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


【解决方案1】:

将其包装在函数中:

    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 中:

Observable.just(doSomething);

将它包装在一个 defer 中,这样它只会在有人订阅它时运行:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多