RxAndroid 2.0.1 subscribe方法未设置变量
好吧,我对安卓和反应式编程相当陌生,在过去的两天里,我一直在尝试制作一个活动,从服务器获取帖子,并将其加载到一个帖子[],稍后在我的应用程序中使用。这里的问题是,当我将Post[]传递给displayspostsmethod时,它是空的。下面是活动中的代码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
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方法执行并设置数组。如果我没有错,您的目标是等待变量更改,然后正确地执行一些操作?看到这个答案了吗