【问题标题】:FATAL EXCEPTION: AsyncTask致命异常:AsyncTask
【发布时间】:2014-06-10 08:20:07
【问题描述】:

今天我在执行 AsyncTask.exception 日志时遇到了 android 应用程序的问题 -

   FATAL EXCEPTION: AsyncTask #1
   java.lang.RuntimeException: An error occured while executing doInBackground()
   at android.os.AsyncTask$3.done(AsyncTask.java:299)
   at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
   at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
   at java.util.concurrent.FutureTask.run(FutureTask.java:239)
   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
   at java.lang.Thread.run(Thread.java:838)
   Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to          java.lang.Void[]
   at com.android.demo.DashBoardActivity$3.doInBackground(DashBoardActivity.java:1)
   at android.os.AsyncTask$2.call(AsyncTask.java:287)
   at java.util.concurrent.FutureTask.run(FutureTask.java:234)

我不知道错误是什么以及为什么应用程序强制关闭。 这种情况在第一次运行后不会发生,而是从应用程序的第二次运行导致异常。

提前致谢。

已编辑-

我在 DashBoardActivity 中使用以下方法注册到 GCM-

public void registerToGCM(){
    try{
          GCMRegistrar.checkDevice(this);
          GCMRegistrar.checkManifest(this);
          registerReceiver(mHandleMessageReceiver, new IntentFilter(
                    AppConstents.DISPLAY_MESSAGE_ACTION));

            final String regId = GCMRegistrar.getRegistrationId(this);
            if (regId.equals("")) {
                GCMRegistrar.register(this, AppConstents.SENDER_ID);
            } else {
                if (GCMRegistrar.isRegisteredOnServer(this)) {
                    Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show();
                } else {
                    final Context context = this;
                    final AsyncTask mRegisterTask = new AsyncTask<Void, Void, Void>() {

                        @Override
                        protected Void doInBackground(Void... params) {
                            GCMServerUtilities.register(context,regId);
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Void result) {
                          //  mRegisterTask = null;
                        }

                    };
                    mRegisterTask.execute(null, null, null);
                }
            }
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

【问题讨论】:

  • 请提供异步任务所在的类代码
  • 提供com.android.demo.DashBoardActivity$3.doInBackground(DashBoardActivity.java:1)指定的类
  • 我已经添加了我的代码。

标签: android android-asynctask threadpoolexecutor


【解决方案1】:

解决方法有以下三种:

1:

final AsyncTask mRegisterTask = new AsyncTask<Object, Void, Void>() {.....

protected Void doInBackground(Object... params) {...

mRegisterTask.execute();

2:

final AsyncTask<Void, Void, Void> mRegisterTask = new AsyncTask<Void, Void, Void>() {.....

mRegisterTask.execute();

3:

final AsyncTask mRegisterTask = new AsyncTask<Void, Void, Void>() {.....

Void[] param = null;

mRegisterTask.execute(param);

【讨论】:

    【解决方案2】:

    你正在使用这样的东西 -

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

    所以这是调用执行的通用 AsyncTask,该类会将 Void 作为参数传递,并且永远不会在您的 asynctask 上调用 .execute(),而是调用 mAsyncTask.execute(Void). 这会给出错误。

    检查此示例实现是否存在此类问题 -object-cannot-be-cast-to-void-in-asynctask

    【讨论】:

    • 我添加了 mAsyncTask.execute(Void) 但警告是创建局部变量 Void。
    • 检查我更新的答案。您不能添加mAsyncTask.execute(Void)。这就是您收到错误的原因。有关详细信息和可能的解决方案,请参见链接。
    • 我通过创建一个类来更改我的异步任务,然后从我这里调用执行工作。感谢您的支持。
    【解决方案3】:

    您正在返回实际对象,但您已在任务的参数中声明它返回 Void。要么不返回对象,要么更改泛型参数以匹配您返回的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多