2017-05-04 4 views
0

사용자 끝점에 간단한 api 호출 (새 사용자 등록)을하고 응답으로 인증 토큰을 가져 오려고합니다. 누구나이 두 네트워크 호출의 차이점을 설명 할 수 있고 어떤 경우 구현이 올바른지 알 수 있습니까?RXJava 및 Retrofit이 올바르게 구현 된 네트워크 호출 - Android

private void registerProcess(User user) { 
    mSubscriptions.add(Network.getRetrofit().getUserToken(user) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<Response<TokenResponse>>() { 
       @Override 
       public void call(Response<TokenResponse> tokenResponse) { 
        if (tokenResponse.code() == 200) { 
         mProgressbar.setVisibility(View.GONE); 
         showSnackBarMessage("Registration success!"); 
        } else { 
         mProgressbar.setVisibility(View.GONE); 
         showSnackBarMessage("Registration failed"); 
        } 

       } 
      })); 

} 

private void registerProcess(User user) { 

    Network.getRetrofit().getUserToken(user) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<Response<TokenResponse>>() { 
       @Override 
       public void onCompleted() { 
        /// what to do here??? 
       } 

       @Override 
       public void onError(Throwable e) { 
        mProgressbar.setVisibility(View.GONE); 
        showSnackBarMessage("Registration failed"); 
       } 

       @Override 
       public void onNext(Response<TokenResponse> tokenResponse) { 
        if (tokenResponse.code() == 200) { 
         mProgressbar.setVisibility(View.GONE); 
         showSnackBarMessage("Registration success!"); 
        } 
       } 
      }); 

} 

답변

1

첫 번째 경우 :

  • 이 때문에, 예를 들어, IOException 앱을 충돌합니다, 더 onError 콜백 처리가 없다.

두 번째 : 그것은 여전히 ​​실행중인 경우 누출 및 예를 들어 활동의 onDestroy 콜백에서 탈퇴하지 않도록

  • 구독, (첫 번째 경우와 달리) 어디에도 저장되지 않습니다.
  • onNext은 성공적인 응답 만 처리하므로 200과 다른 HTTP 코드가 있으면 아무 일도 일어나지 않습니다.
    private void registerProcess(User user) { 
        mSubscriptions.add(Network.getRetrofit().getUserToken(user) 
         .subscribeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(new Subscriber<Response<TokenResponse>>() { 
          @Override 
          public void onCompleted() { 
           // you might do nothing here 
          } 
    
          @Override 
          public void onError(Throwable e) { 
           mProgressbar.setVisibility(View.GONE); 
           showSnackBarMessage("Error!"); 
          } 
    
          @Override 
          public void onNext(Response<TokenResponse> tokenResponse) { 
           if (tokenResponse.code() == 200) { 
            mProgressbar.setVisibility(View.GONE); 
            showSnackBarMessage("Registration success!"); 
           } else { 
            mProgressbar.setVisibility(View.GONE); 
            showSnackBarMessage("Registration failed"); 
           } 
          } 
         }); 
    } 
    

    저장된 모든 구독을 취소하는 활동 (또는 조각)이 파괴 될 때 mSubscriptions.clear()를 호출하는 것을 잊지 마세요 :

올바른 구현이 두 조각의 융합이다.

P.doOnSubscribedoAfterTerminate 연산자를 사용하여 초기 및 터미널 뷰 상태를 적절하게 설정할 수 있습니다. 예를 들어 mProgressbar.setVisibility(View.GONE) 번을 여러 번 호출하지 않으려면 다음과 같이하십시오.

mSubscriptions.add(Network.getRetrofit().getUserToken(user) 
    .doOnSubscribe(() -> mProgressbar.setVisibility(View.VISIBLE)) 
    .doAfterterminate(() -> mProgressbar.setVisibility(View.GONE)) 
    ... 
+0

답장을 보내 주셔서 감사합니다. – MikeB

+0

''.subscribe (새 조치 1 () { @Override 공개 무효 호출 (TokenResponse 응답) { RegisterFragment.this.handleResponse (대응) }} 새로운 조치 1 () { @Override public void call (Throwable error) { RegisterFragment.this.handleError (오류); }'''그게 효과가 있습니까? – MikeB

+0

그래, 확실하니'onComplete' 처리가 풀릴거야. –