2017-12-15 23 views
1

私はかなりアンドロイドとリアクティブプログラミングの新人です。私は過去2日間、サーバーから投稿を取得し、 ]私のアプリで後で使用されます。ここで問題となるのは、そのPost []をdisplayPostsMethodに渡すと、nullです。ここで活動RxAndroid 2.0.1 subscribeメソッドは変数を設定しません

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); 
       }); 
     } 
    } 

のコードであり、ここにもgetAllPostsMethod PostsProvider内のクラスからのコードです。

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); 
    }); 
    } 
+0

あなたのjsonを入れてもよろしいですか? –

+0

私はそれがjsonからのものだとは思っていません。なぜなら、私はokhttpを使わず、getAllPosts()でPost []をハードコードしています。 –

+0

'this.displayPosts(posts);を' this.postsToDispaly = Arrays.copyOf(posts、posts.length);の下に移動しようとしましたか? –

答えて

2

まず、あなたが「getPostFromServer」メソッドを呼び出すと、その後 displayPostsしかし事はgetPostFromServerは、それがで実行されますAsnycTaskようですしているので、[OK]を

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

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

の下の行のシーケンスを確認原因この行の背景

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

ここRxJavaでsays-にサブスクライブ>私は(IOスレッド上Schedulers.io())背景に上記の行を実行したいとO bserveOn(メインスレッド)とそれを購読するときは、非同期タスクでcall executeと同じです

アンドロイドシステムは実行され、バックグラウンドで結果を取得するので、別の方法(表示ポスト)では、 方法表示ポストにログを追加することにより、チェックこのロジックを、あなたが購読

このような
.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の基本ロジックをチェックすることができれば、ユーザーのやりとりを止めることなくバックグラウンドで何かを実行することができます。

+0

あなたの質問が解決されたことを祈っていますが、もし私があなたを助けてくれるならば、 –

+0

私はsubscribe()から取得したデータを保存したい例えばそれをどこかに渡す。また、私は何か間違っていますが、それでもNullPointerExceptionをスローします。 AsuncTaskをdoInBackgroundで使用する方が良いですか? –

+0

ここでデバッグできますか? Post [] posts = gson.fromJson(json、Post []。class); e.onNext(posts); ここからの投稿を に送って、onNext() の前に上記の行にjsonとpostsを印刷するとは思わないが、正確なエラーは何ですか? –

関連する問題