RxAndroid 2.0.1 subscribe方法未设置变量

RxAndroid 2.0.1 subscribe方法未设置变量,android,observable,rx-java2,rx-android,okhttp3,Android,Observable,Rx Java2,Rx Android,Okhttp3,好吧,我对安卓和反应式编程相当陌生,在过去的两天里,我一直在尝试制作一个活动,从服务器获取帖子,并将其加载到一个帖子[],稍后在我的应用程序中使用。这里的问题是,当我将Post[]传递给displayspostsmethod时,它是空的。下面是活动中的代码 public class HomeActivity extends AppCompatActivity{ private Post[] postsToDisplay; @Override pr

好吧,我对安卓和反应式编程相当陌生,在过去的两天里,我一直在尝试制作一个活动,从服务器获取帖子,并将其加载到一个帖子[],稍后在我的应用程序中使用。这里的问题是,当我将Post[]传递给displayspostsmethod时,它是空的。下面是活动中的代码

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);
    });
  }
公共静态可观察getAllPosts(){
返回可观察的。创建((可观察的提交者)->{
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(“示例url”)
.build();
Response=client.newCall(request.execute();
String json=response.body().String();
Gson Gson=新的Gson();
Post[]posts=gson.fromJson(json,Post[].class);
e、 onNext(员额);
});
}

首先,检查以下行的顺序

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

 //dispaly the posts
 this.displayPosts(posts);
好的,您正在调用'getPostFromServer'方法,然后显示Posts 但问题是getPostFromServer就像一个AsnycTask,由于这行代码,它将在后台运行

 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(posts -> {
         this.postsToDispaly = Arrays.copyOf(posts, posts.length);
 });
在RxJava subscribe on中,我想在后台(io线程上的Schedulers.io()和observeOn(主线程)中运行上面的代码行,当您订阅时,它相当于在异步任务中调用execute

所以android系统将在后台执行并获取结果,所以另一种方法(显示帖子)暂时无法获取帖子 通过在方法display post和subscribe result received time中添加日志来检查此逻辑

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

.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,那么在后台执行某些操作时基本逻辑是相同的,而不停止用户交互。

您可以将您的json放进去吗?我不认为它来自json,因为我试图根本不使用okhttp和jsut发出硬编码的Post[]在getAllPosts()中,它仍然执行相同的操作。因此,您尝试移动
this.displayPosts(posts)
到下面的
this.postsToDispaly=Arrays.copyOf(posts,posts.length)?是的,我尝试过,但不幸的是,它仍然产生相同的结果我希望您的问题得到解决,如果不评论我,我将帮助您解决好,但是如果我想存储从subscribe()获取的数据,然后使用它作为示例将其传递到某个地方,该怎么办。也可能我做错了什么,但它仍然抛出NullPointerException。将AsuncTask与DoinBackground一起使用是否更好您可以在这里调试Post[]posts=gson.fromJson(json,Post[].class);e、 onNext(员额);我不认为您从这里获得的帖子会打印json,并在onNext()之前的上面一行中发布,确切的错误是什么?我最近发现subscribe方法中的代码行执行得比我使用postsToDisplay数组晚,因此它是空的。因此,我的下一个问题是如何让应用程序等待subscribe方法执行并设置数组。如果我没有错,您的目标是等待变量更改,然后正确地执行一些操作?看到这个答案了吗