uso tutorial studio que hilos doinbackground curso asynctask java android void

java - tutorial - hilos asynctask android



El objeto[] no se puede convertir en Void[] en AsyncTask (4)

La solución es mucho más simple como la veo yo. Solo crea el objeto subclase de esta manera:

AsyncTask<Void, Void, List<Palina> mAsyncTask = new ListPalinasAsynkTask(callback); .... mAsyncTask.execute();

Recibo este error dentro de una asynctask extendida, pero estoy seguro de que el objeto [] ES un vacío [].

Este es mi AsyncTask personalizado:

public abstract class RepeatableAsyncTask<A, B, C> extends AsyncTask<A, B, C> { private static final String TAG = "RepeatableAsyncTask"; public static final int DEFAULT_MAX_RETRY = 5; private int mMaxRetries = DEFAULT_MAX_RETRY; private Exception mException = null; /** * Default constructor */ public RepeatableAsyncTask() { super(); } /** * Constructs an AsyncTask that will repeate itself for max Retries * @param retries Max Retries. */ public RepeatableAsyncTask(int retries) { super(); mMaxRetries = retries; } /** * Will be repeated for max retries while the result is null or an exception is thrown. * @param inputs Same as AsyncTask''s * @return Same as AsyncTask''s */ protected abstract C repeatInBackground(A...inputs); @Override protected final C doInBackground(A...inputs) { int tries = 0; C result = null; /* This is the main loop, repeatInBackground will be repeated until result will not be null */ while(tries++ < mMaxRetries && result == null) { try { result = repeatInBackground(inputs); } catch (Exception exception) { /* You might want to log the exception everytime, do it here. */ mException = exception; } } return result; } /** * Like onPostExecute but will return an eventual Exception * @param c Result same as AsyncTask * @param exception Exception thrown in the loop, even if the result is not null. */ protected abstract void onPostExecute(C c, Exception exception); @Override protected final void onPostExecute(C c) { super.onPostExecute(c); onPostExecute(c, mException); }

Y esta es la subclase que da el problema:

public class ListPalinasAsynkTask extends RepeatableAsyncTask<Void, Void, List<Palina>>{ private static final String TAG = "ListPalinasAsynkTask"; private static final boolean D = SystemConstants.ACTIVE_DEBUG; private ApiRequest.ListPalinasCallback mCallback; public ListPalinasAsynkTask(ApiRequest.ListPalinasCallback callback) { if(D) Log.d(TAG, "Called: ListPalinasAsynkTask([callback])"); mCallback = callback; } @Override protected List<Palina> repeatInBackground(Void... voids) { /* Here i send request to get palinas */ return Api.getPalinasNearMe(); } @Override protected void onPostExecute(List<Palina> palinas, Exception exception) { if(exception != null) Logging.e(TAG, "Received exception in Asynk Task", exception); if(palinas != null) mCallback.result(palinas); else mCallback.result(new ArrayList<Palina>()); } }

Finalmente, este es el error:

E/ListPalinasAsynkTask﹕ Received exception in Asynk Task java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.Void[] at ListPalinasAsynkTask.repeatInBackground(ListPalinasAsynkTask.java:19) at RepeatableAsyncTask.doInBackground(RepeatableAsyncTask.java:43) at android.os.AsyncTask$2.call(AsyncTask.java:288)

¡No puedo explicar esta excepción porque estoy dando Void como parámetro! Eso no debería ser un objeto. ¿Tienes soluciones?

Edición : ListPalinasAsyncTask.java:19 se refiere a:

public class ListPalinasAsynkTask extends RepeatableAsyncTask<Void, Void, List<Palina>> {

RepeatableAsyncTask.java:43:

result = repeatInBackground(inputs);

EDIT 2:

Estoy llamando a ejecutar de esta manera:

AsyncTask mAsyncTask = new ListPalinasAsynkTask(callback); .... mAsyncTask.execute();


Solución encontrada:

el problema era este

AsyncTask mAsyncTask = new ListPalinasAsynkTask(callback); .... mAsyncTask.execute();

Estoy usando AsyncTask genérico para llamar a execute, esa clase pasaría Void como parámetro y nunca llamará a .execute () en ListPalinasAsynkTask, en su lugar llamará a ListPalinasAsynkTask.execute (Void). Eso da el error.

Soluciones:

  1. Use ListPalinasAsynkTask en lugar de AsyncTask genérico
  2. Mejor uno: crea una nueva clase VoidRepeatableAsyncTask y haz que otros Asid AsyncTasks extiendan esa.

Me gusta esto:

public abstract class VoidRepeatableAsyncTask<T> extends RepeatableAsyncTask<Void, Void, T> { public void execute() { super.execute(); } }

Entonces puedes usar fácilmente algo como esto para llamar a ejecutar:

VoidRepeatableAsyncTask mAsyncTask = new ListPalinasAsynkTask(callback); .... mAsyncTask.execute();

Esto llamará al método de ejecución sin parámetros de AsyncTask.


Trate de usar:

result = repeatInBackground((Void) inputs);

en lugar de

result = repeatInBackground(inputs);


Una forma alternativa con la que lo resolví es pasar Object en parámetros, incluso si no usas los parámetros.

new AsyncTask<Object, Void, MergeAdapter>()

y la anulación:

@Override protected ReturnClass doInBackground(Object... params) { //... }

Lo anterior se aplica (en mi caso) si quiere pasar diferentes tipos de AsyncTasks a un método y, por supuesto, no le importan los parámetros.