我遇到停止进度对话框的问题。 BackgroundWorkerActivity用于用户授权和注册。当用户填写登录布局上的用户名和密码字段,并单击登录按钮时,系统启动授权并且进度对话框开始循环,并在消息框出现进入下一个布局时停止。另一方面,当用户使用错误数据或字段为空时,此进度对话框不会消失。出现消息框,显示"字段为空"或"无效的登录凭据",但进度对话框仍保留在布局上。这是BackgroundWorkerActivity:
public class BackgroundWorker extends AsyncTask<String, Void, String >{
Context context;
AlertDialog alertDialog ;
BackgroundWorker (Context ctx){
context = ctx;
}
ProgressDialog loading;
@Override
protected String doInBackground(String... params) {
String type = params[0];
String login_url = "http://sultonkhuja1111.000webhostapp.com/MobApp/auth_login.php";
String register_url = "http://sultonkhuja1111.000webhostapp.com/MobApp/registration.php";
if(type.equals("login")){
try {
String user_name = params[1];
String password = params[2];
URL url = new URL(login_url);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String post_data = URLEncoder.encode("user_name","UTF-8")+"="+URLEncoder.encode(user_name,"UTF-8")+"&"
+URLEncoder.encode("password","UTF-8")+"="+URLEncoder.encode(password,"UTF-8");
bufferedWriter.write(post_data);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
String result="";
String line="";
while ((line = bufferedReader.readLine())!= null){
result+=line;
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else if(type.equals("register")){
try {
// String spnUsertype = params[1];
String txtFirst = params[1];
String txtLast = params[2];
String txtEmail = params[3];
String txtUsername = params[4];
String txtPassword = params[5];
String txtPhone = params[6];
URL url = new URL(register_url);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String post_data = //URLEncoder.encode("user_type","UTF-8")+"="+URLEncoder.encode(spnUsertype,"UTF-8")+"&"
URLEncoder.encode("first","UTF-8")+"="+URLEncoder.encode(txtFirst,"UTF-8")+"&"
+ URLEncoder.encode("last","UTF-8")+"="+URLEncoder.encode(txtLast,"UTF-8")+"&"
+ URLEncoder.encode("email","UTF-8")+"="+URLEncoder.encode(txtEmail,"UTF-8")+"&"
+ URLEncoder.encode("username","UTF-8")+"="+URLEncoder.encode(txtUsername,"UTF-8")+"&"
+ URLEncoder.encode("password","UTF-8")+"="+URLEncoder.encode(txtPassword,"UTF-8")+"&"
+URLEncoder.encode("phone","UTF-8")+"="+URLEncoder.encode(txtPhone,"UTF-8");
bufferedWriter.write(post_data);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
String result="";
String line="";
while ((line = bufferedReader.readLine())!= null){
result+=line;
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
loading = ProgressDialog.show(context, "Loading Menu", "Please wait...", false, false);
alertDialog = new AlertDialog.Builder(context).create();
alertDialog.setTitle("Login Status");
}
@Override
protected void onPostExecute(String result) {
// alertDialog.setMessage(result);
// alertDialog.show();
if (result.contains("Successfully")) {
loading.dismiss();
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
Intent i2 = new Intent(context, Login.class);
context.startActivity(i2);
} else if(result.contains("Congratulations")) {
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
Intent i = new Intent(context, MainActivity.class);
context.startActivity(i);
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
答案 0 :(得分:0)
您应该将loading.dismiss();
提取到onPostExecute
的顶部。
您只检查包含用户尝试成功的案例。
答案 1 :(得分:0)
对于 用户名 和 密码 等必填字段,您应该验证它(空字符,无效字符,没有足够的长度,等...)传递到网络层(在您的情况下由后台线程处理)。
在您的代码中,在后台线程完成任务时关闭对话框。在回调方法 onPostExecute 上,您应该删除 中的 loading.dismiss(); 条件然后将它放在回调方法的顶部,在所有if-else块之外。
答案 2 :(得分:0)
将onPostExecute
方法更改为
@Override
protected void onPostExecute(String result) {
// alertDialog.setMessage(result);
// alertDialog.show();
loading.dismiss();
if (result.contains("Successfully")) {
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
Intent i2 = new Intent(context, Login.class);
context.startActivity(i2);
} else if(result.contains("Congratulations")) {
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
Intent i = new Intent(context, MainActivity.class);
context.startActivity(i);
}