【发布时间】:2018-04-06 23:30:13
【问题描述】:
我正在尝试停止 Android 中的 AsyncTask。在 doInBackground 中,它通过一个 IP 地址列表运行并尝试 ping 所有这些。
此外,执行 AsyncTask 时会打开一个 ProgressDialog,您可以取消该对话框。调用此取消 - 文本调用 AsyncTask 中的 onCancelled 方法。所以,这个方法正在被调用,但它似乎永远不会停止,因为当我再次点击按钮 Find 时,我总是收到以下错误消息:
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
这是我的代码:
private Settings.HostWorker hostWorker;
private void initComponents() {
hostWorker = new Settings.HostWorker();
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
if(!hostWorker.isCancelled()) {
hostWorker.cancel(true);
}
}
});
}
findServerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
if(findServerButton.isClickable()) {
progressDialog.show();
hostWorker.execute();
findServerButton.setClickable(false);
}
}
});
private class HostWorker extends AsyncTask<Integer, String, Void> {
@Override
protected Void doInBackground(Integer... params) {
try {
for (int i = 0; i <= 255; i++) {
String ip = createHostsList(i);
if (ip != null) {
publishProgress(ip);
}
if(isCancelled())
{
break;
}
}
} catch (Exception e) {
MyAlertDialog myAlertDialog = new MyAlertDialog(getBaseContext(), "Error in Settings - doInBackground: " + e.getMessage());
myAlertDialog.showAlertDialog();
}
return null;
}
protected void onProgressUpdate(String... values) {
hostsOnline.add(values[0]);
settingsCustomArrayAdapter.notifyDataSetChanged();
}
protected void onCancelled(){
findServerButton.setClickable(true);
}
@Override
protected void onPostExecute(Void aVoid)
{
super.onPostExecute(aVoid);
}
}
【问题讨论】:
-
这正是它所说的 - 你必须创建新的 AsyncTask 对象才能运行,因为你的
HostWorker已经处于无效状态。