【问题标题】:AsyncTask android exception (Cannot execute task: the task has already been executed)AsyncTask android异常(无法执行任务:任务已经执行)
【发布时间】:2016-05-10 20:41:31
【问题描述】:

我有 java.lang.IllegalStateException: Cannot execute task: 虽然我像这样创建了一个新的 AsyncTask 实例,但该任务已经执行(一个任务只能执行一次)

new ClientEngine(ip, port).execute(WindowsEventsEnum.MouseLeftButtonClick);

这是我的代码

    public class ClientEngine extends AsyncTask<WindowsEventsEnum, Void, Void>{
    final String ip;
    final int port;
DatagramSocket socket;
    InetAddress remoteAdress;
    DatagramPacket sendingPacket;
    final String VOLUMEUP = "01";
    final String VOLUMEDOWN = "02";
    final String LMBCLICK = "11";
    final String RMBCLICK = "12";
    final String MMBUP = "21";
    final String MMBDOWN = "22";
    final String ENDCONNECTION = "ec";


    public ClientEngine(String ip, int port) throws SocketException, UnknownHostException {
        this.ip = ip;
        this.port = port;
        socket = new DatagramSocket();
        remoteAdress = InetAddress.getByName(ip);
    }

    public void OpenConnection() throws IOException {


    }

    public void CloseConnection() throws IOException {

socket.close();
    }

    public void MouseLeftButtonClick() throws IOException {
byte[] sendDatagram = LMBCLICK.getBytes();
        sendingPacket = new DatagramPacket(sendDatagram, sendDatagram.length, remoteAdress, port);
        socket.send(sendingPacket);
    }

    public void MouseRightButtonClick() throws IOException {
        byte[] sendDatagram = RMBCLICK.getBytes();
        sendingPacket = new DatagramPacket(sendDatagram, sendDatagram.length, remoteAdress, port);
        socket.send(sendingPacket);
    }

    public void SystemVolumeUp() throws IOException {

    }

    public void SystemVolumeDown() throws IOException {

    }

    @Override
    protected Void doInBackground(WindowsEventsEnum... params) {
        switch (params[0]) {
            case MouseLeftButtonClick:
                try {
                    MouseLeftButtonClick();
                    CloseConnection();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case MouseRightButtonClick:
                try {
                    MouseRightButtonClick();
                    CloseConnection();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
       return null;
    }

}

【问题讨论】:

  • 您尝试执行相同的任务两次,这是 AsyncTask 不允许的。如果您仍然卡住,请将代码发布到您实际开始任务的位置。
  • 不一样。我创建了一个新的类实例
  • 同样,错误状态为其他,因此我们需要查看您开始执行两项任务的代码。

标签: java android android-asynctask


【解决方案1】:

抱歉,您已经解决了这个问题。 但一般来说,每当你遇到这样的异常时,

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

检查您是否遵守以下所有规则:

  1. AsyncTask 只能执行一次(如果尝试第二次执行会抛出异常。)

    就像多次启动一个线程是非法的一样。

多次启动一个线程是不合法的。特别是,一个 线程一旦完成执行就可能不会重新启动。

所以创建一个像new asyncTask().execute(); 这样的新实例是唯一的选择

  1. onPreExecute(), doInBackground(), onProgressUpdate(),onPostExecute() 不应手动调用。

  2. 必须在 UI 线程上加载 AsyncTask 类。这从 JELLY_BEAN 开始自动完成。

  3. 任务实例必须在 UI 线程上创建。

  4. execute(Params...) 必须在 UI 线程上调用。

确保您已遵循代码中的所有 5 条规则。

阅读更多:https://developer.android.com/reference/android/os/AsyncTask.html

【讨论】: