2017-12-02 163 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

我只是想立即得到响应,因为在下一步我将使用返回值来使另一个请求 –