2017-12-15 27 views
1

저는 Android 및 반응 프로그래밍에 상당히 익숙하며 지난 이틀 동안 서버에서 게시물을 가져 와서 게시물에로드하는 활동을 시도했습니다 [ ] 내 애플 리케이션에서 나중에 사용됩니다. 여기서 문제는 그 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 []를 하드 코딩하고 emitt도 똑같이한다. –

+0

그래서 this.displayPosts (posts);를'this.postsToDispaly = Arrays.copyOf (posts, posts.length); 아래로 이동 시키려고합니까? –

답변

2

먼저, 다음 displayPosts 을 'getPostFromServer'메소드를 호출하고있어, 그래서

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

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

확인 아래 라인의 순서를 확인하지만, 일이 getPostFromServer 것은 그것이 실행 것 AsnycTask 같다 배경 때문에이 라인 여기 RxJava에서

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

내가 (IO 스레드에서 Schedulers.io()) 백그라운드에서 위의 라인을 실행하려면> says-에 가입하고 오에 bserveOn (주 스레드) 및 구독 할 때 그것은 비동기 작업에서 호출을 실행하는 것과 같습니다.

그래서 안드로이드 시스템은 백그라운드에서 결과를 얻고 결과를 얻습니다. 그래서 다른 방법 (표시 게시물)은 당분간 게시물을 얻지 못합니다 검사 방법에 로그를 추가하여이 논리는 게시물을 표시하고 시간을 접수 및 결과에 가입

.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 throw합니다. doInBackground와 함께 AsuncTask를 사용하는 것이 더 낫습니다. –

+0

여기서 디버그 할 수 있습니까? Post [] posts = gson.fromJson (json, Post []. class); e.onNext (posts); 여기에서 오는 게시물이 인 경우 onNext() 앞에 json과 게시물이 인쇄되어 있다고 생각하지 않습니다. 정확한 오류는 무엇입니까? –