1

개조를 사용하여 응답을 올바르게 얻은 다음 응답 본문의 객체에 응답을 전달하고 UI 스레드에서 객체를 가져 오는 데 실패합니다. NullPointerException 오류, 비동기 요청의 문제라고 생각합니다. 어떻게이 문제를 피할 수 있습니까?Android 개조 요청 메인 개조에서 개장 응답받는 방법

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button = findViewById(R.id.button); 

    util = new Util(this); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      util.login("[email protected]", "sdjflsdkf"); 

      // There is a NullPointerException? How Can I 
      // use this methond correctly in this way? 
      Log.d("user", util.getUserInfo().toString()); 
     } 
    }); 
} 

public class Util { 
    private UserInfo userInfo; 

    public UserInfo getUserInfo() { 
     return userInfo; 
    } 

    public void login(final String email, final String password) { 
     Call<UserInfo> loginCall = apiInterface.login(email, password); 
     loginCall.enqueue(new Callback<UserInfo>() { 
      @Override 
      public void onResponse(Call<UserInfo> call, Response<UserInfo> response) { 
       userInfo = response.body(); 
     } 

     @Override 
     public void onFailure(Call<UserInfo> call, Throwable t) { 
     } 
    }); 
} 

답변

0

이동 당신은 너무 정말 사용자 정보 객체를 받고있는 onResponse()

Log.d("user", util.getUserInfo().toString()); 

안쪽이 라인, 그것은 당신이

처럼 액세스하려고하는 시점에서 널 (null)입니다
public class Util { 
    public interface Callback { 
     void onResponse(UserInfo info); 
    } 
    private UserInfo userInfo; 

    public UserInfo getUserInfo() { 
     return userInfo; 
    } 

    public void login(final String email, final String password, final Callback callback) { 
     Call<UserInfo> loginCall = apiInterface.login(email, password); 
     loginCall.enqueue(new Callback<UserInfo>() { 
      @Override 
      public void onResponse(Call<UserInfo> call, Response<UserInfo> response) { 
       userInfo = response.body(); 
       callback.onResponse(userInfo); 
       Log.d("user", userInfo.toString()); 
     } 

     @Override 
     public void onFailure(Call<UserInfo> call, Throwable t) { 
     } 
    }); 
} 

그리고 사용 방법은 다음과 같습니다.

Util.login("email", "password", new Util.Callback() { 
    void onResponse(User info) { 
     // Update UI 
    } 
}); 

이 콜백은 메모리가 누출 될 수 있으므로 현재 활동/조각을 남겨두면 정리하십시오.

+0

네,하지만 저는 clickListener에서 반환 값을 얻고 싶습니다. 그렇지 않으면 응답 블록으로 이동하면 얻을 수 없습니다. –

+0

하지만 클릭 수신기에서 얻을 수없는 경우에는 수신기 (onClick) 메소드가 네트워크 호출이 응답으로 돌아 오기 훨씬 전에 실행 완료, 응답으로 무엇을 하시겠습니까? UI를 업데이트 하시겠습니까? – elmorabea

+0

다음 단계에서 다른 값을 사용하기 위해 반환 값을 사용하기 때문에 즉시 응답을 원합니다. –