RxAndroid 2.0.1订阅方法没有设置变量

时间:2017-12-15 16:43:18

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

好的我对Android和反应式编程都相当新,我在过去两天一直在努力创建一个从服务器上发帖子并将它们加载到Post []中的活动,后来在我的应用程序中使用。这里的问题是,当我将Post []传递给displayPostsMethod时,它为null。这是活动

中的代码
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);
    });
  }

1 个答案:

答案 0 :(得分:2)

首先,检查下面的行序列

 //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中订阅了 - &gt;我想在后台运行上面的行(在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基本逻辑是相同的,在后台执行某些操作而不停止用户交互。