运行时 Android 小部件的 java.lang.NoClassDefFoundError

Posted

技术标签:

【中文标题】运行时 Android 小部件的 java.lang.NoClassDefFoundError【英文标题】:java.lang.NoClassDefFoundError at Runtime Android Widget 【发布时间】:2012-10-23 21:29:18 【问题描述】:

我在运行 android 2.3.3 及更早版本的 Android 小部件时遇到问题。

当我在屏幕上安装我的小部件时,会打印此错误:

11-03 10:26:31.127: E/AndroidRuntime(404): FATAL EXCEPTION: main
11-03 10:26:31.127: E/AndroidRuntime(404): java.lang.NoClassDefFoundError: com.app.myapp.StackWidgetService
11-03 10:26:31.127: E/AndroidRuntime(404):  at com.app.myapp.StackWidgetProvider.onUpdate(StackWidgetProvider.java:229)
11-03 10:26:31.127: E/AndroidRuntime(404):  at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:61)
11-03 10:26:31.127: E/AndroidRuntime(404):  at com.app.mobideals.StackWidgetProvider.onReceive(StackWidgetProvider.java:216)
11-03 10:26:31.127: E/AndroidRuntime(404):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:1794)
11-03 10:26:31.127: E/AndroidRuntime(404):  at android.app.ActivityThread.access$2400(ActivityThread.java:117)
11-03 10:26:31.127: E/AndroidRuntime(404):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981)
11-03 10:26:31.127: E/AndroidRuntime(404):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-03 10:26:31.127: E/AndroidRuntime(404):  at android.os.Looper.loop(Looper.java:123)
11-03 10:26:31.127: E/AndroidRuntime(404):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-03 10:26:31.127: E/AndroidRuntime(404):  at java.lang.reflect.Method.invokeNative(Native Method)
11-03 10:26:31.127: E/AndroidRuntime(404):  at java.lang.reflect.Method.invoke(Method.java:507)
11-03 10:26:31.127: E/AndroidRuntime(404):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-03 10:26:31.127: E/AndroidRuntime(404):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-03 10:26:31.127: E/AndroidRuntime(404):  at dalvik.system.NativeStart.main(Native Method)

问题是由于编译器没有到达在 StackWidgetProvider 类的 onUpdate 方法中的这一行执行到 StackWidgetService 类的链接:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 

        // update each of the widgets with the remote adapter
        for (int i = 0; i < appWidgetIds.length; ++i) 

            // Here we setup the intent which points to the StackViewService which will
            // provide the views for this collection.
            Intent intent = new Intent(context, StackWidgetService.class);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);

该小部件适用于其他版本的 Android,如 3.0、4.0 等...

请帮帮我:)

【问题讨论】:

您是否在 Manifest 中声明了服务? 即使我遇到了同样的问题。你有没有解决这个问题。请帮我解决这个问题 【参考方案1】:

如果您已将 eclipse 插件更新到 ADT 17,您的解决方案可能在这里:Android java.lang.NoClassDefFoundError

也可以在这里查看:http://android.foxykeep.com/dev/how-to-fix-the-classdefnotfounderror-with-adt-17

【讨论】:

感谢您的回复。好像不是这个错误。事实上,问题在于方法:appWidgetManager.notifyAppWidgetViewDataChanged(i, R.id.stack_view); 此方法不适用于我的清单中指定的 min target sdk 10:&lt;uses-sdk android:minSdkVersion="10" android:targetSdkVersion="12" /&gt; 因为我想涵盖 Android 2.3.3(目标 10),而在我之前是最小目标 = 11。我该怎么做才能替换此方法(notifyAppWidgetViewDataChanged 或引入条件以仅在目标 = 11 时使用此代码?

以上是关于运行时 Android 小部件的 java.lang.NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

屏幕打开/关闭时如何更新 Android 小部件?

Android小部件上的线程

从Android小部件的文本框中检索文本?

Android:配置小部件(不同小部件实例的相同 setOnClickPendingIntent 附加功能)

强制 Android 小部件更新

Android 小部件在模拟器中运行良好,但在手机上它变成了 Google App 小部件