Якт*_*Тид 2 java android android-asynctask
我有java.lang.IllegalStateException:无法执行任务:该任务已经执行(一个任务只能执行一次),尽管我这样创建了AsyncTask的新实例
new ClientEngine(ip, port).execute(WindowsEventsEnum.MouseLeftButtonClick);
Run Code Online (Sandbox Code Playgroud)
这是我的代码
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;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
抱歉,如果您已解决问题。但是通常,只要您遇到这样的异常,
java.lang.IllegalStateException:无法执行任务:该任务已经执行(一个任务只能执行一次)
检查是否遵循以下所有规则:
AsyncTask只能执行一次(如果尝试第二次执行,则将引发异常。)
就像多次启动一个线程是非法的情况一样。
一次启动一个线程永远是不合法的。特别是,线程一旦完成执行就可能不会重新启动。
所以创建一个新的实例new asyncTask().execute();
是唯一的选择
onPreExecute(), doInBackground(), onProgressUpdate(),onPostExecute()
不应手动调用。
必须在UI线程上加载AsyncTask类。从JELLY_BEAN开始,这是自动完成的。
必须在UI线程上创建任务实例。
必须在UI线程上调用execute(Params ...)。
确保已遵循代码中的所有5条规则。
了解更多:https : //developer.android.com/reference/android/os/AsyncTask.html
归档时间: |
|
查看次数: |
1467 次 |
最近记录: |