Como detener un asynctask y volverlo a ejecutar

634 views
Skip to first unread message

Alejandro Cantos

unread,
Mar 22, 2016, 11:18:27 AM3/22/16
to desarrolladores-android
Mi problema es el siguiente, quiero hacer que mientras la pantalla esté pulsada, se haga una cosa, cuando deje de pulsarse se pare de hacer, y al volverla a pulsar continue haciendola.
He conseguido que al pulsar empieze la tarea, y al dejar de pulsar se pare, pero cunado vuelvo a pulsar la pantalla, me salta un error, y la aplicación se detiene, he intentado hacerlo de otra manera, pero entonces al volver a pulsar, la tarea no vuelve a empezar.

¿Alguna idea?  El código y el error es el siguiente:

private class onTouchig extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... params) {

while (pulsando==true) {

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

runOnUiThread(new Thread() {
public void run() {

RestarNumero();

Vibrar();

SharedPreferences();

Cerrar();

}
});

}
return null;
}

}

//Se ejecutara al tocar la pantalla
@Override
public boolean onTouch(View v, MotionEvent event) {

//comprobamos que boton fue pulsado
switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:
pulsando=true;

if(Touching.getStatus()!= AsyncTask.Status.RUNNING)
Touching.execute();




return true;

case MotionEvent.ACTION_UP:

pulsando = false;
Touching.cancel(true);

break;
}
}


03-22 16:07:29.616 19264-19264/com.dontstoptouching E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: com.dontstoptouching, PID: 19264
                                                                      java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
                                                                          at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:579)
                                                                          at android.os.AsyncTask.execute(AsyncTask.java:535)
                                                                          at com.dontstoptouching.Lvl1.onTouch(Lvl1.java:89)
                                                                          at android.view.View.dispatchTouchEvent(View.java:7704)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                          at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                          at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                          at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
                                                                          at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
                                                                          at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
                                                                          at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
                                                                          at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
                                                                          at android.view.View.dispatchPointerEvent(View.java:7889)
                                                                          at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
                                                                          at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
                                                                          at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                                          at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                                                                          at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                                                                          at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
                                                                          at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                                                                          at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
                                                                          at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                                          at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                                                                          at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                                                                          at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                                                                          at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                                          at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5612)
                                                                          at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5592)
                                                                          at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5563)
                                                                          at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5692)
                                                                          at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                          at android.os.MessageQueue.nativePollOnce(Native Method)
                                                                          at android.os.MessageQueue.next(MessageQueue.java:138)
                                                                          at android.os.Looper.loop(Looper.java:123)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:5050)
                                                                          at java.lang.reflect.Method.invokeNative(Native Method)
                                                                          at java.lang.reflect.Method.invoke(Method.java:515)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
                                                                          at dalvik.system.NativeStart.main(Native Method)

Según entiendo, dice que la tarea ha sido ejecutada y solo puede ejecutarse una vez, por ello salta el error, pero no se como detenerla o pararla paraque no salte ese error

Gabriel Pozo

unread,
Mar 22, 2016, 5:41:36 PM3/22/16
to desarrolladores-android
Crea el objeto Touching en el action down, y en el action up podrías hacer despues del cancel un Touching = null; (en el action down antes de comprobar si esta corriendo la tarea, deberías verificar si es null y allí lo volves a crear)
O algo por el estilo, si no simplemente intentas ejecutar una tarea que ya cancelaste. No se si se entiende.

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/e0707f88-bc5c-43a9-bb49-f3636d07042f%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Alejandro Cantos

unread,
Mar 23, 2016, 6:39:54 AM3/23/16
to desarrolladores-android
Ya funciona, pero no se si es la manera correcta de hacerlo, creo que no, a ver, lo que he hecho es lo siguiente:

private class onTouching extends AsyncTask<String, Void, String> {


@Override
protected String doInBackground(String... params) {

while (pulsando==true) {

try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
e.printStackTrace();
}

runOnUiThread(new Thread() {
public void run() {

                    pulsando();

}
});

}
return null;
}
}


//Se ejecutara al tocar la pantalla
@Override
public boolean onTouch(View v, MotionEvent event) {

//comprobamos que boton fue pulsado
switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:
pulsando=true;
                    new onTouching().execute();
                return true;

case MotionEvent.ACTION_UP:
pulsando = false;
                break;


}
}

Yo el problema que veo ahi, es que cada vez que pulso se ejecuta un nuevo hhilo, y al dejar de pulsar no se detiene, aun así, al pulsar varias veces, no veo que se cree ningun nuevo hilo, no se si esa forma es la correcta de hacerlo.

Gabriel Pozo

unread,
Mar 23, 2016, 6:03:56 PM3/23/16
to desarrolladores-android
Claro que no se detiene, porque intentas cancelar un objeto al que no tenes referencia.
Antes que nada en el try catch te recomiendo poner un log ;)

Yo te decía, algo diferente, por ejemplo, después del touching.cancel (del primer código que enviaste voy a hablar) hacer algo similar a un touching = null;  Y antes del if, hacer algo como:
if(touching == null) touching = new Touching();

Esto lo digo en el aire, vos deberías estructurar bien tu código, pero algo así sería la idea.

P.D: touching debería ser una variable de tipo Touching, para hacer lo que te digo :D ;)

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Reply all
Reply to author
Forward
0 new messages