java.lang.ClassNotFoundException:由AdMob / Google Play服务引起的android.os.AsyncTask?

时间:2014-11-27 14:50:35

标签: android android-asynctask admob

自2014年11月21日起,我收到数百份崩溃报告,其中包含以下堆栈。

崩溃仅发生在API Level 10设备上(该应用程序支持9 +)

相同版本的应用程序在崩溃开始前的几周内运行良好。这让我觉得问题是由最近推送到Android 2.3设备的一些无线更新引起的。

我在我的应用中使用AdMob中介(现在是Google Play服务库的一部分)和其他几个广告网络SDK。

我怀疑Google Play服务库会导致崩溃,因为根据我的知识,它是应用程序的唯一部分,可能会通过无线方式进行更新(这不是第一次越野车更新会导致崩溃。)

如OP的回答here所述,是否有可能在AdMob创建的展示横幅广告的线程内触发的未捕获异常可能会使整个过程处于无法执行的状态再创建新的类实例?

最近有没有人遇到类似的问题?

java.lang.NoClassDefFoundError: com.myapp.MyClassExtendingAsyncTask
at com.myapp.x.run(SourceFile:417)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3859)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.myapp.MyClassExtendingAsyncTask in loader dalvik.system.PathClassLoader[/data/app/com.myapp-1.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
... 10 more

4 个答案:

答案 0 :(得分:14)

好的,看起来这是其中一个版本的Google Play服务的问题。 见https://code.google.com/p/android/issues/detail?id=81083

看起来似乎可以将以下内容添加到Application#onCreate()

package acme.com.myAppName;

import android.app.Application;

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        // begin add
        try {
            Class.forName("android.os.AsyncTask");
        } catch(Throwable ignore) {
        }
        // end add

        super.onCreate();
    }
}

注意,不要忘记在AndroidManifest.xml中配置您的Application类(如果您还没有)。

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="acme.com.myAppName.MyApplication" >
...
</application>

答案 1 :(得分:5)

要扩展上面的答案,因为我不知道Application#onCreate()是什么,并且还没有在我的应用程序中实现它。 我所做的是在我的应用程序中使用以下内容创建一个新类:

package acme.com.myAppName;

import android.app.Application;

public class myApplication extends Application
{
    @Override
    public void onCreate()
    {
        try
        {
            Class.forName("android.os.AsyncTask");
        }
        catch(Throwable ignore){}

        super.onCreate();
    }
}

然后我用android:name="acme.com.myAppName.myApplication"更新了我的AndroidManifest.xml文件以使用myApplication类,如下所示:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="acme.com.myAppName.myApplication" >
...
</application>

答案 2 :(得分:0)

同样的问题,自23/11以来,我在2.x客户端上出现了大约1500个ClassNotFoundException错误,并且呈上升趋势。 该应用程序数月未更新,因此我同意您关于Google Play服务ota更新的假设

答案 3 :(得分:0)

我用try catch块包围了我的adview.loadAd(adrequest);,这解决了我的问题。

以下是代码段:

    try
    {
    adview.loadAd(adRequest);
    }
    catch(java.lang.NoClassDefFoundError ncdfe)
    {
        ncdfe.printStackTrace();
        Log.d("AD ERROR", "ERROR LOADING AD");
    }