ANDROID,改型:在API调用过程中按下后退按钮会使应用程序崩溃
我正在进行改造,以便在我的android应用程序中调用RESTAPI。要调用API,我使用类似以下代码:ANDROID,改型:在API调用过程中按下后退按钮会使应用程序崩溃,android,retrofit2,Android,Retrofit2,我正在进行改造,以便在我的android应用程序中调用RESTAPI。要调用API,我使用类似以下代码: private void saveAddress(){ // check if internet is available if(InternetUtil.getInstance(getApplicationContext()).isOnline()) { if(validator.validate()) { showLoader();
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);
}
}
问题是,当我点击SaveAddress按钮时,API被调用。如果中间有人按下硬件后退按钮,我的应用程序就会崩溃
一种处理方法是引入一个布尔变量,如canGoBack。在调用API之前,我可以将其设置为false,在收到响应之后,我可以将其设置为true。
然后我必须像这样更换goBack:
@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();
}
private void goBack(){
if(canGoBack){
Intent intent = new Intent(AddAddressActivity.this, AddressListActivity.class);
startActivity(intent);
finish();
}
}
我觉得上面的代码不符合最佳实践(只有jugaad),必须有更好的方法来做到这一点
另外,当有人在调用过程中按下home按钮时?这是因为API调用是异步执行的。当调用API时屏幕被关闭时,调用仍在执行,响应在类的
onResponse
方法中获得。当活动被销毁时,它将具有空值。尝试在onBackPressed
方法中取消API调用。更好的方法是在onStop
方法中使用此代码
if(call!=null)
call.cancel()
这不是你处理后退按钮的方式。您可以按Backpress。另外,在没有发布完整堆栈跟踪的情况下,不要发布“thishcrasted”。此外,你的想法完全是倒退的。您不会因为某个API调用挂起而阻止用户返回。实际上,我还有一个后退按钮,单击该按钮也会调用goBack,我还将对堆栈进行后期跟踪。一旦按下了onback,则这两个按钮都会调用goBack。但是你仍然不能把back按钮当作一个普通的硬件按钮来对待。试着不要在back press时调用intent,而是在finish时调用onBackPressed。