为什么单击提交按钮时未打开进度对话框
Why Progress Dialog is not open while clicking on Submit Button
我设置了以太网的IP。在这里,我在特定路径上创建文件和 运行 IP 集的代码,即 sudo。
一切正常,但在单击提交按钮时未显示进度对话框,但 setOnClickListener
中提到的所有其他功能都正常工作。
谁能帮帮我。
submt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
validationIP();
if (var == true) {
ProgressDialog progressdialog = new ProgressDialog(Third_Ethernet_Layout.this);
progressdialog.setMessage("Please Wait....");
progressdialog.show();
progressdialog.setCancelable(false);
progressdialog.setCanceledOnTouchOutside(false);
try {
File file = new File(filepath);
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
write();
sudo(ipfetch, netmaskfetch, gatewayfetch, dns1fetch, dns2fetch);
progressdialog.dismiss();
finish();
Toast.makeText(Third_Ethernet_Layout.this, "Ethernet IP Change Successfully", Toast.LENGTH_SHORT).show();
}
}
});
您正在使用 progressdialog.dismiss();
,因此关闭了进度对话框。
您应该为此使用异步任务
private class AsyncAboutUs extends AsyncTask<Void, Void, Void> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressdialog = new ProgressDialog(Third_Ethernet_Layout.this);
progressdialog.setMessage("Please Wait....");
progressdialog.show();
progressdialog.setCancelable(false);
progressdialog.setCanceledOnTouchOutside(false);
}
@Override
protected Void doInBackground(Void... strings) {
try {
File file = new File(filepath);
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
write();
sudo(ipfetch, netmaskfetch, gatewayfetch, dns1fetch, dns2fetch);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (!isCancelled()) {
finish();
}
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
}
ON 按钮点击:
submt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
validationIP();
if (var == true) {
new AsyncAboutUs().execute();
}
}
});
显示进度对话框的代码工作正常,可能是进程很快,这就是进度对话框不可见的原因。
可以尝试使用线程睡眠来实际查看它是否存在问题。
它确实显示了进度,但您可以通过调用 dismiss() 并进一步调用 finish() 来立即隐藏它。
但是,在处理程序中执行繁重的任务是实现您想要的目标的不正确方法。反正它不会像你想的那样工作。将会发生的是您的代码将阻塞处理程序内的 UI 线程,并且不会显示任何进度(如果您保持足够长的时间,应用程序可能会被终止)。
正确的做法是实现一个 AsyncTask,本文档中有一个简单的代码示例 link。您需要在 doInBackground() 中显示 () 进度对话框、执行异步任务、执行文件等代码,并在途中通过 publishProgress 更新进度值。
在 onProgressUpdate() 中,更新对话框或必填字段,最后,在 onPostExecute 中执行 finish() 或您希望在完成时执行的其他操作。
我设置了以太网的IP。在这里,我在特定路径上创建文件和 运行 IP 集的代码,即 sudo。
一切正常,但在单击提交按钮时未显示进度对话框,但 setOnClickListener
中提到的所有其他功能都正常工作。
谁能帮帮我。
submt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
validationIP();
if (var == true) {
ProgressDialog progressdialog = new ProgressDialog(Third_Ethernet_Layout.this);
progressdialog.setMessage("Please Wait....");
progressdialog.show();
progressdialog.setCancelable(false);
progressdialog.setCanceledOnTouchOutside(false);
try {
File file = new File(filepath);
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
write();
sudo(ipfetch, netmaskfetch, gatewayfetch, dns1fetch, dns2fetch);
progressdialog.dismiss();
finish();
Toast.makeText(Third_Ethernet_Layout.this, "Ethernet IP Change Successfully", Toast.LENGTH_SHORT).show();
}
}
});
您正在使用 progressdialog.dismiss();
,因此关闭了进度对话框。
您应该为此使用异步任务
private class AsyncAboutUs extends AsyncTask<Void, Void, Void> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressdialog = new ProgressDialog(Third_Ethernet_Layout.this);
progressdialog.setMessage("Please Wait....");
progressdialog.show();
progressdialog.setCancelable(false);
progressdialog.setCanceledOnTouchOutside(false);
}
@Override
protected Void doInBackground(Void... strings) {
try {
File file = new File(filepath);
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
write();
sudo(ipfetch, netmaskfetch, gatewayfetch, dns1fetch, dns2fetch);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (!isCancelled()) {
finish();
}
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
}
ON 按钮点击:
submt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
validationIP();
if (var == true) {
new AsyncAboutUs().execute();
}
}
});
显示进度对话框的代码工作正常,可能是进程很快,这就是进度对话框不可见的原因。 可以尝试使用线程睡眠来实际查看它是否存在问题。
它确实显示了进度,但您可以通过调用 dismiss() 并进一步调用 finish() 来立即隐藏它。
但是,在处理程序中执行繁重的任务是实现您想要的目标的不正确方法。反正它不会像你想的那样工作。将会发生的是您的代码将阻塞处理程序内的 UI 线程,并且不会显示任何进度(如果您保持足够长的时间,应用程序可能会被终止)。
正确的做法是实现一个 AsyncTask,本文档中有一个简单的代码示例 link。您需要在 doInBackground() 中显示 () 进度对话框、执行异步任务、执行文件等代码,并在途中通过 publishProgress 更新进度值。 在 onProgressUpdate() 中,更新对话框或必填字段,最后,在 onPostExecute 中执行 finish() 或您希望在完成时执行的其他操作。