2017-12-02 183 views
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()); 

你所得到的用戶信息對象太真的,它是空的時候,你是在試圖訪問它

就像那個

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

但是你不能得到它在click監聽器中,你的監聽器onClick()方法會在網絡調用回來之前很久才完成執行,您想對響應做什麼?更新UI? – elmorabea

+0

我只是想立即得到響應,因爲在下一步我將使用返回值來使另一個請求 –