1

retrofitを使用してレスポンスを正しく取得した後、レスポンスボディのオブジェクトにレスポンスを渡しますが、UIスレッドでオブジェクトを取得できません。 NullPointerExceptionエラー、私はそれが非同期要求の問題だと思います、どうすればこの問題を回避できますか?Android Retrofitリクエストメインスレッドでレトロフィットレスポンスを取得する方法

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

次のステップでは戻り値を使用して別のリクエストを行うため、すぐに応答を取得したい –

関連する問題