在AsyncTask中,Object 不能转换为Void

我在一个扩展的asynctask里面得到了这个错误,但是我确定Object []是一个Void []。

这是我自定义的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); } 

这是给出问题的子类:

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

最后,这是错误的:

 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) 

我无法解释这个exception,因为我给Void作为参数! 这不应该是一个对象。 你有解决scheme吗?

    编辑 :ListPalinasAsyncTask.java:19是指:

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

    RepeatableAsyncTask.java:43:

     result = repeatInBackground(inputs); 

    编辑2:

    我打电话这样执行:

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

    Related of "在AsyncTask中,Object 不能转换为Void"

    解决scheme发现

    问题是这样的:

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

    我使用genericsAsyncTask来调用execute,该类将传递Void作为参数,将永远不会调用ListPalinasAsynkTask上的.execute(),而是将调用ListPalinasAsynkTask.execute(Void)。 这给了错误。

    解决scheme:

    1. 使用ListPalinasAsynkTask而不是通用的AsyncTask
    2. 更好的一个:创build一个新类VoidRepeatableAsyncTask,并使其他无效的AsyncTasks扩展一个。

    喜欢这个:

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

    那么你可以很容易地使用这样的事情来调用execute:

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

    这将调用AsyncTask的无参数执行方法。

    我解决它的另一种方法是在参数中传递Object ,即使您不使用参数。

     new AsyncTask<Object, Void, MergeAdapter>() 

    和覆盖:

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

    如果你想传递不同types的AsyncTasks到一个方法,当然你不关心参数,以上适用(在我的情况)。

    我看到这个解决scheme简单得多。 只需以这种方式创build子类对象:

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

    尝试使用:

     result = repeatInBackground((Void) inputs); 

    代替

     result = repeatInBackground(inputs);