当前位置: 首页 > 知识库问答 >
问题:

无法将AsyncTask中的对象[]强制转换为void[]

孙承弼
2023-03-14

我在一个扩展的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)
public class ListPalinasAsynkTask extends RepeatableAsyncTask<Void, Void, List<Palina>> {
result = repeatInBackground(inputs);

我是这样叫execute的:

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

共有1个答案

狄灵均
2023-03-14

找到的解决方案:

问题是这样的:

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

我正在使用泛型AsyncTask调用execute,该类将把Void作为参数传递,并且永远不会对ListPalinasAsynkTask调用.execute(),相反,它将调用ListPalinasAsynkTask.execute(Void)。这就给出了错误。

    null
public abstract class VoidRepeatableAsyncTask<T> extends RepeatableAsyncTask<Void, Void, T> {
    public void execute() {
        super.execute();
    }
}
VoidRepeatableAsyncTask mAsyncTask = new ListPalinasAsynkTask(callback);
....
mAsyncTask.execute();

这将调用AsyncTask的no-parameters execute方法。

 类似资料:
  • 问题内容: 我在扩展的asynctask中遇到此错误,但我确实确定Object []是Void []。 这是我的自定义AsyncTask: 这是产生问题的子类: 最后,这是错误: 我无法解释此异常,因为我将Void作为参数!那不应该是一个对象。你有解决方案吗? 编辑 :ListPalinasAsyncTask.java:19是指: RepeatableAsyncTask.java:43: 编辑2:

  • 我有一种方法,可以按照班级团队中的国家对数据库中的数据进行排序。Hibernate在列表中返回我的数据 我的错误日志: 我的冠军联赛课程: 我的班级: }

  • 我有JSON文件看起来像 所以这个键是一个字符串“SUBS_ID”,这个值是一个名为Feature细节的模型,它包含属性“特性设置名称、特性名称、...”。所以我用这样google.json库从JSON文件中读取, 然后我试图循环这个HashMap获取值,并将其转换为我的Feature细节模型, 这是我的FeatureDetails模型, 但我得到了一个例外"com.google.gson.int

  • 问题内容: 我有MainActivity类,该类具有实例化ApplicationBar的方法,所有其他Activity都从此继承,因此他们可以使用此方法。 但是我也有一个MapHolder类,它必须从xml中扩展,因为它使用来显示地图。问题是如果我从不显示ApplicationBar选项卡扩展它,并且从MainActivity扩展它而不显示地图,则出现此错误: 问题答案: 您正在尝试将a强制转换为

  • 问题内容: 我收到以下异常。 造成原因: java.lang.ClassCastException:无法将java.math.BigInteger强制转换为java.lang.Integer 用下面的代码 在这条线 有人知道吗? 问题答案: 您可以使用: 或者也许覆盖了和价值观。

  • 问题内容: 我长期困扰这个问题。我有一段时间搜索此问题,但没有解决方案。 结构体: 我也用我 在我的。 请提供有关如何解决此问题的一些信息。 问题答案: 从中删除注释并使其: 发生您的问题是因为的特化,这意味着Spring将尝试创建注入实例。由于superclass()不是通用的,因此您无法将其向下转换为,因此这行代码将失败(与尝试使用手动实例化该代码的方式相同): 专业课仍应使用注释。当spri