簡體   English   中英

AsyncTask android異常(無法執行任務:該任務已經執行)

[英]AsyncTask android exception (Cannot execute task: the task has already been executed)

我有java.lang.IllegalStateException:無法執行任務:該任務已經執行(一個任務只能執行一次),盡管我這樣創建了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;
    }

}

抱歉,如果您已解決問題。 但是通常,只要您遇到這樣的異常,

java.lang.IllegalStateException:無法執行任務:該任務已經執行(一個任務只能執行一次)

檢查是否遵循以下所有規則:

  1. AsyncTask只能執行一次(如果嘗試第二次執行,則將引發異常。)

    就像多次啟動一個線程是非法的情況一樣。

一次啟動一個線程永遠是不合法的。 特別是,線程一旦完成執行就可能不會重新啟動。

因此,創建一個新實例,例如new asyncTask().execute(); 是唯一的選擇

  1. onPreExecute(), doInBackground(), onProgressUpdate(),onPostExecute()

  2. 必須在UI線程上加載AsyncTask類。 從JELLY_BEAN開始,這是自動完成的。

  3. 必須在UI線程上創建任務實例。

  4. 必須在UI線程上調用execute(Params ...)。

確保已遵循代碼中的所有5條規則。

了解更多: https : //developer.android.com/reference/android/os/AsyncTask.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM