【问题标题】:Stopping AsyncTask in Android在 Android 中停止 AsyncTask
【发布时间】: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 已经处于无效状态。

标签: android android-asynctask


【解决方案1】:

错误

无法执行任务:任务已经执行(一个任务只能执行一次)

建议您每次要运行任务时都需要创建一个新的HostWorker 实例。您可以通过删除该行来实现这一点

hostWorker = new Settings.HostWorker();

来自initComponents,而是将其添加到您的findServerButton OnClickListener 中,如下所示:

findServerButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v)
    {
        if(findServerButton.isClickable()) {
            progressDialog.show();
            hostworker = new Settings.HostWorker(); // Line added here.
            hostWorker.execute();
            findServerButton.setClickable(false);
        }
    }
});

【讨论】:

  • 谢谢,我按照你的建议做了!现在,Activity 不会像往常一样崩溃。好吧,现在当我再次单击查找按钮时,它会从停止的地方开始。所以,我必须在这里改变一些东西,但我想我会以正确的方式做到这一点。谢谢你的帮助。一直以为进程不会停止(也许来不及了,该去睡觉了!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多