android - 致命异常 : AsyncTask

标签 android android-asynctask threadpoolexecutor

今天我在执行 AsyncTask 时遇到了 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();
    }
}

最佳答案

可以通过三种方式解决:

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

关于android - 致命异常 : AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24136126/

相关文章:

android - android native 应用程序的默认 User-Agent 字符串是什么?

android - 在 Android 中取消异步任务

python - 如何将线程局部变量与 ThreadPoolExecutor 一起使用?

java - 将arraylist发送到fragment以动态填充数据

android - 在 GLSurfaceView 上覆盖 xml 布局的最佳实践?

android - GoogleSignInAccount getIdToken() 为空

android - Android 中的处理程序与异步调用

java - 异步同步

java - 如何从 Java 在 Android 设备上运行 adb screenrecord 并结束屏幕录制?

Java ExecutorService - 扩展