我应该使用 AsyncTask 还是 threads on hold 按钮操作?
Should I use AsyncTask or threads on hold button action?
我有一个将数据写入套接字的 AsyncTask,但我不想执行按住按钮直到释放的 onTouch 事件。我实际上已经用 AsyncTask 做到了,但是应用程序在写入套接字后崩溃了。我应该改用线程还是有更好的解决方案?
编辑:我在 logcat 中收到消息 "Waiting for a blocking GC Alloc"。
OnTouchListener 代码:
buttonUp.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
while(true){
if (event.getAction() == MotionEvent.ACTION_DOWN){
new moveForward().execute();
} else if (event.getAction() == MotionEvent.ACTION_UP){
break;
}
}
return false;
}
});
AsyncTask 代码:
private class moveForward extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
try {
MainActivity.client.write('u');
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
}
}
你永远不应该 运行 在主 UI 线程上无限循环。您可以在 ACTION_DOWN 中开始一项任务,并在 ACTION UP 中结束它。您无休止地开始多项任务。试试这个代码
moveForward moveForward;
buttonUp.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
moveForward = new moveForward();
moveForward.execute();
} else if (event.getAction() == MotionEvent.ACTION_UP){
moveForward.cancel(true);
}
return false;
}
});
private class moveForward extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
while(!isCancelled()) {
try {
MainActivity.client.write('u');
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
}
}
我有一个将数据写入套接字的 AsyncTask,但我不想执行按住按钮直到释放的 onTouch 事件。我实际上已经用 AsyncTask 做到了,但是应用程序在写入套接字后崩溃了。我应该改用线程还是有更好的解决方案?
编辑:我在 logcat 中收到消息 "Waiting for a blocking GC Alloc"。
OnTouchListener 代码:
buttonUp.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
while(true){
if (event.getAction() == MotionEvent.ACTION_DOWN){
new moveForward().execute();
} else if (event.getAction() == MotionEvent.ACTION_UP){
break;
}
}
return false;
}
});
AsyncTask 代码:
private class moveForward extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
try {
MainActivity.client.write('u');
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
}
}
你永远不应该 运行 在主 UI 线程上无限循环。您可以在 ACTION_DOWN 中开始一项任务,并在 ACTION UP 中结束它。您无休止地开始多项任务。试试这个代码
moveForward moveForward;
buttonUp.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
moveForward = new moveForward();
moveForward.execute();
} else if (event.getAction() == MotionEvent.ACTION_UP){
moveForward.cancel(true);
}
return false;
}
});
private class moveForward extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
while(!isCancelled()) {
try {
MainActivity.client.write('u');
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
}
}