我正在与Retrofit一起在我的android应用中调用REST API。要调用API,我使用类似于以下代码:
private void saveAddress(){
// check if internet is available
if(InternetUtil.getInstance(getApplicationContext()).isOnline()) {
if(validator.validate()) {
showLoader();
CustomerAPI customerAPI =
HttpClient.getClient().create(CustomerAPI.class);
Call<HashMap<String, String>> call = customerAPI.createAddress(address);
call.enqueue(new Callback<HashMap<String, String>>() {
@Override
public void onResponse(Call<HashMap<String, String>> call, Response<HashMap<String, String>> response) {
canGoBack = true;
HashMap<String, String> resultMap = response.body();
if (resultMap.get(Constant.CREATE_OPERATION_RESPONSE_KEY).equals(Constant.ADDRESS_CREATED_RESPONSE_VALUE)) {
hideLoader();
}
}
@Override
public void onFailure(Call<HashMap<String, String>> call, Throwable t) {
System.out.println(t.getMessage());
}
});
}
}else{
DialogUtil.showNoInternetDialog(this);
}
}
我这样处理硬件:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
goBack();
return true;
}
return false;
}
/**
* Go back to previous activity
*/
private void goBack(){
Intent intent = new Intent(AddAddressActivity.this, AddressListActivity.class);
startActivity(intent);
finish();
}
问题是,当我单击“保存地址”按钮时,将调用API。如果在两者之间有人按下硬件后退按钮,我的应用程序将崩溃。
一种处理方法是引入一个布尔变量,如 canGoBack 。在调用API之前,我可以将其设置为false,在收到响应后,可以将其设置为true。 然后我必须像这样更改goBack:
private void goBack(){
if(canGoBack){
Intent intent = new Intent(AddAddressActivity.this, AddressListActivity.class);
startActivity(intent);
finish();
}
}
我认为上述代码不是最佳做法(仅适用于jugaad),并且必须有一种更好的方法。
还有,当有人在通话过程中按下主屏幕按钮吗?
答案 0 :(得分:1)
那是因为API调用是异步执行的。当在调用API时关闭屏幕时,调用仍在执行,并且在类的onResponse
方法中获得响应。当活动被销毁时,它将具有空值。尝试取消onBackPressed
方法中的API调用。更好的方法是在onStop
方法中使用此代码。
if(call!=null)
call.cancel()