我在我的应用程序中实现了一个登录DialogFragment(API 19)。我使用Retrofit 1.7.1进行网络连接。实施如下:
public class SignInDialogFragment extends DialogFragment {
private EditText mUsernameEditText;
private EditText mPasswordEditText;
public static SignInDialogFragment newInstance() {
return new SignInDialogFragment();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Builder builder = new AlertDialog.Builder(getActivity())
.setPositiveButton(R.string.action_sign_in, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String username = mUsernameEditText.getText().toString();
APIFactory.getAPI().register(username, new Callback<RegistrationResponseModel>() {
@Override
public void success(RegistrationResponseModel registrationResponse, Response response) {
Toast.makeText(getActivity(), "Totally worked!", Toast.LENGTH_SHORT).show();
}
@Override
public void failure(RetrofitError error) {
Toast.makeText(getActivity(), "Something failed!", Toast.LENGTH_SHORT).show();
}
});
}
})
.setNegativeButton(R.string.action_cancel, null);
View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_sign_in, null);
builder.setView(view);
mUsernameEditText = (EditText)view.findViewById(R.id.usernameEditText);
return builder.create();
}
}
正如您可能预测的那样,当getActivity()
遇到空引用时,这会在成功或失败时崩溃。 处理异步请求的最佳方法是什么,包括在解除对话后获取回调?
我想到了几个选择;他们中的任何一个都可行吗?
如果有正在进行的请求,我可以简单地打开对话框。我还没有实现这个,因为我不确定保持对话的最干净方法(处理后退按钮等)。
我真的想在对话框关闭时取消请求,但我不能,因为there is not currently a way to cancel Retrofit requests。
如果有一个我不知道的选项,我想听听它。
答案 0 :(得分:4)
您应该将您的操作移出Dialog。对话框不是活动 - 一旦用户做出选择,对话框就应该被取消,如果有任何触发它的动作应该以响应对用户操作对话框进行,但它不应该是对话的一部分。因此,您应该只对父片段或活动中的用户选择做出反应,而不是在对话框中做出反应。