2014-07-05 3 views
0

비동기 네트워크 요청을 위해 'Retrofit'을 사용하고 있습니다. 어떻게 로그인을 처리 할 수있는 기능이 있습니까? 예를 들어 내가 현재 시도했습니다ASync 네트워킹 요청이있는 로그인 기능?

public UserAuthResponse Login(String username, String password) { 

    try { 

     Callback<UserAuthResponse> getAuthCallback = new Callback<UserAuthResponse>() { 

      @Override 
      public void failure(RetrofitError arg0) { 

       if (arg0 != null) { 
        if (arg0.getMessage() != null 
          && arg0.getMessage().length() > 0) { 
         Log.e("KFF-Retrofit", arg0.getMessage()); 
        } 
       } 

      } 

      @Override 
      public void success(UserAuthResponse listItem, 
        retrofit.client.Response arg1) { 

       Log.e("dg", listItem.getUser().getFirstname()); 
      } 
     }; 

     service.authUser(username, MD5(password), getAuthCallback); 

     return response; 

    } catch (RetrofitError e) { 

     e.printStackTrace(); 
     return null; 
    } 

} 

그러나 이것은 결함이 : 함수에서 'UserAuthResponse'를 반환하는 방법은 없습니다? 결과를 어떻게 되돌릴 수 있습니까? 내가 웹 서비스에 동기 호출을 필요로하지만 내가 맞았 것 같은

그것은 보이는 'NetworkOnMainThreadException'

이런 것들에 대한 가장 좋은 방법은 무엇입니까? 가난한 설명에 대해 유감스럽게 생각하며 올바른 말을 고안하는 데 어려움을 겪고 있습니다.

답변

0

잘 일하기 전에 반드시 사용은 당신이 얻기의 당신의 수단으로 콜백을 사용할 때 응답을 인라인으로 반환 할 가능성을 자동으로 알리는 추가 작업 결과. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 나는 당신이 디자인에 가장 적합한 것을 선택하는 것은 당신에게 달려 있다고 생각합니다.

콜백 접근 방식을 사용하지 않고 Retrofit의 인라인 결과를 사용하기로 결정할 수 있습니다. 그렇다면 직접 스케쥴링을 처리해야합니다. 그렇지 않으면 위에서 언급 한 NetworkOnMainThreadException의 예외가 발생합니다.

또한 로그인 방법에 리스너를 전달할 수도 있습니다. 이 청취자는 결과 콜백에 의해 호출 될 수 있습니다. 이것은 Retrofit을 서비스 계층의 일종으로 숨기고 간단한 로그인 인터페이스를 노출하려는 경우 유용 할 수 있습니다.

interface OnLoginListener { 
    onLoginSuccessful(UserAuthResponse response); 
    onLoginFailed(Throwable t); 
} 

public void Login(String username, String password, final OnLoginListener listener) { 
    Callback<UserAuthResponse> getAuthCallback = new Callback<UserAuthResponse>() { 
       @Override 
       public void failure(RetrofitError e) { 
        // You can handle Retrofit exception or simply pass them down to the listener as is 
        listener.onLoginFailed(e); 
       } 

       @Override 
       public void success(UserAuthResponse listItem, 
         retrofit.client.Response arg1) { 
        // handle successful case here and pass down the data to the listener 
        listener.onLoginSucessful(listItem); 
       } 
      }; 

    service.authUser(username, MD5(password), getAuthCallback); 
} 
+0

정확히 무슨 일을했는지, 로그인을 시작하고, '성공'리스너를 지정하고, 콜백을 통해받은 경우 적절한 메시지를 표시합니다. 이 대답은 최고이므로 받아 들일 것입니다. – Broak

-1

사용이 줄을 내가

<uses-permission android:name="android.permission.INTERNET"/> 

매니페스트 또는 네트워크 작업 (암시되지 않음)

if (Build.VERSION.SDK_INT>= 10) { 
     ThreadPolicy tp = ThreadPolicy.LAX; 
     StrictMode.setThreadPolicy(tp); 
     } 
+1

이 제안은 단순히 '최고의 이슈'를 숨기고있는 것이라고 생각합니다. – Broak