Objekt kann nicht in Leere in AsyncTask geworfen werden

Ich bekomme diesen Fehler in einer erweiterten Asynthask, aber ich bin mir sicher, dass Object [] IS a Void [] ist.

Dies ist meine benutzerdefinierte AsyncTask:

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); } 

Und das ist die SubClass, die das Problem gibt:

 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>()); } } 

Schließlich ist das der Fehler:

 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) 

Ich kann diese Ausnahme nicht erklären, denn ich gebe Void als Parameter! Das sollte kein Objekt sein. Haben Sie Lösungen?

Bearbeiten : ListPalinasAsyncTask.java:19 bezieht sich auf:

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

RepeatableAsyncTask.java:43:

 result = repeatInBackground(inputs); 

EDIT 2:

Ich rufe so auf:

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

  • Java.lang.Void vs void vs Null
  • 4 Solutions collect form web for “Objekt kann nicht in Leere in AsyncTask geworfen werden”

    Lösung gefunden:

    Das Problem war das:

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

    Ich benutze generische AsyncTask, um execute aufzurufen, diese Klasse würde Void als Parameter übergeben und wird niemals .execute () auf ListPalinasAsynkTask aufrufen, stattdessen wird es ListPalinasAsynkTask.execute (Void) aufrufen. Das gibt den fehler

    Lösungen:

    1. Verwenden Sie ListPalinasAsynkTask anstelle von generischen AsyncTask
    2. Besser ein: Erstellen Sie eine neue Klasse VoidRepeatableAsyncTask und machen Sie andere Void AsyncTasks erweitern diese.

    So was:

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

    Dann kannst du ganz einfach so etwas anrufen:

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

    Dies ruft die No-Parameter-Methode von AsyncTask auf.

    Ein alternativer Weg, mit dem ich es gelöst habe, ist, Object in Parametern zu übergeben, auch wenn man die Parameter nicht benutzt.

     new AsyncTask<Object, Void, MergeAdapter>() 

    Und die überschreibung:

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

    Das obige gilt (in meinem Fall), wenn Sie verschiedene Arten von AsyncTasks auf eine Methode übergeben möchten und natürlich kümmern Sie sich nicht um die Parameter.

    Die Lösung ist viel einfacher, wie ich es sehe. Erstellen Sie einfach das Unterklassenobjekt auf diese Weise:

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

    Versuchen Sie es mit:

     result = repeatInBackground((Void) inputs); 

    Anstatt von

     result = repeatInBackground(inputs); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.