【问题标题】:RxAndroid 2.0.1 subscribe method doesnt set a variableRxAndroid 2.0.1 订阅方法没有设置变量
【发布时间】:2017-12-15 16:43:18
【问题描述】:

好吧,我对 android 和响应式编程还很陌生,过去两天我一直在尝试创建一个活动,从服务器获取帖子并将它们加载到 Post[] 中,稍后在我的应用程序中使用。这里的问题是,当我将该 Post[] 传递给 displayPostsMethod 时,它为空。这是Activity中的代码

public class HomeActivity extends AppCompatActivity{
        private Post[] postsToDisplay;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_home);

                //get the posts from the server
                this.getPostsFromServer();

                //dispaly the posts
                this.displayPosts(posts);// here are the posts null
        }

        public void getPostsFromServer() {
                PostsProvider.getAllPosts()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(posts -> {
                    this.postsToDispaly = Arrays.copyOf(posts, posts.length);
                });
        }
    }

这也是 PostsProvider 类中 getAllPostsMethod 的代码。

public static Observable<Post[]> getAllPosts(){
    return Observable.create((ObservableEmitter<Post[]> e) -> {
      OkHttpClient client = new OkHttpClient();

      Request request = new Request.Builder()
          .url("sample url")
          .build();

      Response response = client.newCall(request).execute();

      String json = response.body().string();

      Gson gson = new Gson();

      Post[] posts = gson.fromJson(json, Post[].class);
      e.onNext(posts);
    });
  }

【问题讨论】:

  • 可以把你的json放上去吗?
  • 我不认为它来自 json,因为我试图根本不使用 okhttp 并且在 getAllPosts() 中发出硬编码 Post[] 并且它仍然这样做。
  • 那么您是否尝试将this.displayPosts(posts); 移动到this.postsToDispaly = Arrays.copyOf(posts, posts.length); 的下方?
  • 是的,不幸的是我试过它仍然产生相同的结果

标签: android observable rx-java2 rx-android okhttp3


【解决方案1】:

首先,检查下面的行顺序

 //get the posts from the server
 this.getPostsFromServer();

 //dispaly the posts
 this.displayPosts(posts);

好的,所以你调用 'getPostFromServer' 方法,然后调用 displayPosts 但问题是 getPostFromServer 就像一个 AsnycTask 由于这条线,它将在后台运行

 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(posts -> {
         this.postsToDispaly = Arrays.copyOf(posts, posts.length);
 });

在 RxJava 中订阅说-> 我想在后台运行上面的行(在 io 线程上的 Schedulers.io())和 observeOn(主线程),当你订阅的东西相当于在异步中调用 execute任务

所以 android 系统将在后台执行并获取结果,因此另一种方法(显示帖子)暂时不会获取帖子 通过在显示帖子和订阅结果接收时间的方法中添加日志来检查此逻辑

更好的是,您可以从订阅中调用显示帖子 像这样

.subscribe(posts -> {
                if(posts!=null)//check i think null will not be received in Rxjava 2.0 so also add error method in which you can show no result to be displayed
                displayPosts(posts);
            },err->{//add no posts found here and dismiss progress dialog/progress bar
                    err.printStackTrace();
              });

在您调用 API 之前,您可以显示进度对话框或进度条

检查线程系统是如何工作的,它在 RxJava 中是相同的逻辑,所以如果你可以检查 AsyncTask 和 doInBackground,基本逻辑是相同的,可以在后台执行某些操作而不停止用户交互。

【讨论】:

  • 我希望你的问题得到解决,如果没有评论我会帮助你
  • 好的,但是如果我想存储从 subscribe() 获得的数据,然后使用它例如将其传递到某个地方怎么办。也可能我做错了什么,但它仍然抛出 NullPointerException。将 AsuncTask 与 doInBackground 一起使用会更好吗
  • 你能在这里调试吗 Post[] posts = gson.fromJson(json, Post[].class); e.onNext(帖子);我不认为你从这里获取的帖子在 onNext() 之前打印 json 和上面的帖子,确切的错误是什么?
  • 我最近发现 subscribe 方法中的代码行在我使用 postsToDisplay 数组之后才执行,因此它为空。所以我的下一个问题是如何让应用程序等到执行订阅方法并设置数组。
  • 如果我没记错的话,您的目标是等待变量更改然后执行一些操作,对吗?看到这个答案stackoverflow.com/questions/38738760/…
猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2019-02-07
  • 2011-04-04
相关资源
最近更新 更多