让我们考虑一下:
我的应用程序将显示一个文本对话框(用户应该输入他/她的名字)。用户名将被发送到服务器以检查它是否是唯一的。它使用AsyncTask与服务器通信。
我有两条路:
一个。服务器的响应正常(用户名是唯一的),因此用户界面对话框消失了。这很容易。
B中。第二种情况是用户名不是唯一的。我希望我的用户名对话框仍然显示在屏幕上。之前输入的所有信息也应保留。所以,我不能只创建一个新的对话框!
我不是Android专家,所以我的想法来自我的一般经验,因此我的态度可能不太好。
只是不要忽略用户名对话框。如果用户名是唯一的,请致电dismiss
中的onPostExecute
。我认为我必须将对话框实例传递给我的异步任务。我认为国家(我之前说过的信息)不会被破坏。
失败后重新绘制用户名对话框(在onPostExecute
中)。这似乎是一个糟糕的解决方案,因为我有两种不同的方法显示用户名对话框。
您怎么看?
答案 0 :(得分:0)
我最近用android中的对话框做了类似的事情。在我的情况下,我正在检查登录是否正确,如果登录正确,则对话框已关闭,否则对话框保持打开状态并显示错误消息。
这听起来你想要实现的目标并不难做到!听起来您假设您的AsyncTask不会受到对话活动的控制,但它只能放在对话框片段中。
对话(cutoms)不会自行解散,你必须告诉它什么时候解雇(除非用户点击外面或按下)。
点击此处开始使用:https://developer.android.com/guide/topics/ui/dialogs.html
在标题下方查看:创建自定义布局
修改强>
以下是请求的示例,您可以看到AsyncTask与Dialog片段在同一个类中执行。
public Dialog onCreateDialog(final Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.login_dialog, null);
et_username = (EditText) view.findViewById(R.id.et_username);
btn_login = (Button) view.findViewById(R.id.btn_login);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new login().execute(et_username.getText().toString());
}
});
builder.setView(view);
return builder.create();
}
private class login extends AsyncTask<String, Integer, JSONObject> {
@Override
protected JSONObject doInBackground(String... params) {
DAO dao = new DAO();
return dao.login(params[0);
}
@Override
protected void onPostExecute(JSONObject result) {
try{
if(result != null){
//Do something with my result
}
} catch (JSONException je) {
System.out.println("A JSON exception occurred!");
}
}
}