在WIN DEATH之后,Android应用程序与java.lang.NoClassDefFoundError崩溃

时间:2011-09-01 12:51:44

标签: android crash android-asynctask

我定义了一个AsyncTask并从MapView类中创建了一个实例。一切都运行得很好,除非Android决定杀死窗口,然后当我尝试重新打开活动时,应用程序崩溃,我的AsyncTask出现NoClassDefFoundError。我也试过让AsyncTask类静态但没有改变。

我已经多次测试过了,我很有信心这次事故是由于活动被杀死了。

[更新]我没有发布堆栈跟踪,因为我没有看到任何相关内容。我已经完成了一些测试,现在我在日志中看到了一些可以提供线索的内容:

I/ActivityManager(  144): Displayed activity com.myorg.myApp/.MyActivity: 4456 ms (total 4456 ms)
I/dalvikvm( 3413): **Rejecting re-init on previously-failed class** Lcom/myorg/myApp/MyMapView$MyAsyncTask; v=0x0
D/AndroidRuntime( 3413): Shutting down VM
W/dalvikvm( 3413): threadid=1: thread exiting with uncaught exception (group=0x400207e8)
E/AndroidRuntime( 3413): FATAL EXCEPTION: main
E/AndroidRuntime( 3413): java.lang.NoClassDefFoundError: com.myorg.myApp.MyMapView$MyAsyncTask
E/AndroidRuntime( 3413):    at com.myorg.myApp.MyMapView$4.run(MyMapView.java:169)
E/AndroidRuntime( 3413):    at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 3413):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 3413):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 3413):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 3413):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3413):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 3413):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 3413):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 3413):    at dalvik.system.NativeStart.main(Native Method)

行: I / dalvikvm(3413):拒绝重新启动先前失败的类 让我觉得它来自之前的错误,但我发现日志中没有其他堆栈跟踪或报告错误。

2 个答案:

答案 0 :(得分:2)

我需要一个堆栈跟踪来确定,但我认为你的问题类似于in this other question所描述的问题。

类加载器不一定找不到你的AsyncTask类 - 在加载类时,或者在启动支持AsyncTask的线程的过程中抛出了一些错误,这会阻止类加载器加载类。

我猜WIN DEATH导致一些奇怪的内部状态没有被检查并且正在抛出错误。

答案 1 :(得分:2)

我在UI线程中解决了这个问题

getActivity().runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            asynTask = new LoadWebAsynTask();
            asynTask.execute();
        }
    });