在application onCreate中初始化类时发生java.lang.NoClassDefFoundError

在application onCreate中初始化类时发生java.lang.NoClassDefFoundError,java,android,android-volley,android-lru-cache,Java,Android,Android Volley,Android Lru Cache,我试图在我的应用程序onCreate方法上实例化一个类,如下所示: volleyQueueInstance = VolleySingleton.getInstance(getApplicationContext()); 下面是我的截击单打课 public class VolleySingleton { private static VolleySingleton mInstance; private RequestQueue mRequestQueue; private

我试图在我的应用程序
onCreate
方法上实例化一个类,如下所示:

volleyQueueInstance = VolleySingleton.getInstance(getApplicationContext());
下面是我的
截击单打

public class VolleySingleton {
    private static VolleySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    private VolleySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(30);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized VolleySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new VolleySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}
我对java和android相当陌生,不明白为什么它找不到这个类。据我所知,它能够找到类,但异常发生在我试图定义
mImageLoader
的构造函数中。不过我不确定。任何帮助都将不胜感激

使现代化 好的,我尝试用另一台设备(三星s4)启动该应用程序,该应用程序运行良好。但当我在另一台设备(三星谷歌Nexus S)上试用时,它会因为上面的stacktrace而崩溃

更新#2 我在上面的stacktrace中遗漏了一些日志条目,也许这有助于了解发生了什么

01-05 05:46:12.933    3029-3029/rides.even.odd.oddorevenrides E/dalvikvm﹕ Could not find class 'rides.even.odd.oddorevenrides.volleyclasses.VolleySingleton$1', referenced from method rides.even.odd.oddorevenrides.volleyclasses.VolleySingleton.<init>
01-05 05:46:12.933    3029-3029/rides.even.odd.oddorevenrides W/dalvikvm﹕ VFY: unable to resolve new-instance 9625 (Lrides/even/odd/oddorevenrides/volleyclasses/VolleySingleton$1;) in Lrides/even/odd/oddorevenrides/volleyclasses/VolleySingleton;
01-05 05:46:12.933    3029-3029/rides.even.odd.oddorevenrides D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x001d
01-05 05:46:12.949    3029-3029/rides.even.odd.oddorevenrides D/dalvikvm﹕ DexOpt: unable to opt direct call 0xfd9f at 0x1f in Lrides/even/odd/oddorevenrides/volleyclasses/VolleySingleton;.<init>
01-05 05:46:13.343    3029-3029/rides.even.odd.oddorevenrides D/AndroidRuntime﹕ Shutting down VM
01-05 05:46:13.343    3029-3029/rides.even.odd.oddorevenrides W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40d2a300)
01-05 05:46:14.070    3029-3029/rides.even.odd.oddorevenrides E/AndroidRuntime﹕ FATAL EXCEPTION: main
01-05 05:46:12.933 3029-3029/rides.偶数.oddorevenrides E/dalvikvm﹕ 找不到类“rides.偶数.oddorevenrides.volleyclasses.VolleySingleton$1”,引用方法为rides.偶数.oddorevenrides.volleyclasses.VolleySingleton。
01-05 05:46:12.933 3029-3029/乘骑自行车。偶数。奇数。奥多雷文尼乘骑自行车,带dalvikvm﹕ VFY:无法在Lrides/偶数/odd/oddorevenrides/volleyclasses/VolleySingleton$1;中解析新实例9625;
01-05 05:46:12.933 3029-3029/乘骑、偶数、奇数﹕ VFY:在0x001d处替换操作码0x22
01-05 05:46:12.949 3029-3029/乘骑、偶数、奇数﹕ DexOpt:无法在Lrides/偶数/奇数/oddorevenrides/volleyclasses/VolleySingleton;中的0x1f处选择直接调用0xfd9f;。
01-05 05:46:13.343 3029-3029/乘骑自行车。偶数。奇数。奥多雷文乘骑自行车D/安德鲁尼计时﹕ 关闭虚拟机
01-05 05:46:13.343 3029-3029/乘骑游乐设施。偶数。奇数。奥多列文乘骑游乐设施,带dalvikvm﹕ threadid=1:线程以未捕获异常退出(组=0x40d2a300)
01-05 05:46:14.070 3029-3029/乘骑自行车、偶数自行车、奇数自行车、偶数自行车、偶数自行车﹕ 致命异常:主

好的,经过几个小时的研究,我终于解决了这个问题。这里的问题是
MultiDex
支持。和以前一样,我的应用程序中也有部分multidex支持

multiDexEnabled true
在我的build.gradle文件中,但我的应用程序正在扩展
应用程序

刚刚让我的应用程序类扩展类,并在我的应用程序类文件中添加了以下方法

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
能够通过研究以下日志条目来解决此问题

01-05 05:46:12.949    3029-3029/rides.even.odd.oddorevenrides D/dalvikvm﹕ DexOpt: unable to opt direct call 0xfd9f at 0x1f in Lrides/even/odd/oddorevenrides/volleyclasses/VolleySingleton;.<init>
01-05 05:46:12.949 3029-3029/rides.偶数.oddorevenrides D/dalvikvm﹕ DexOpt:无法在Lrides/偶数/奇数/oddorevenrides/volleyclasses/VolleySingleton;中的0x1f处选择直接调用0xfd9f;。

好的,经过几个小时的研究,我终于解决了这个问题。这里的问题是
MultiDex
支持。和以前一样,我的应用程序中也有部分multidex支持

multiDexEnabled true
在我的build.gradle文件中,但我的应用程序正在扩展
应用程序

刚刚让我的应用程序类扩展类,并在我的应用程序类文件中添加了以下方法

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
能够通过研究以下日志条目来解决此问题

01-05 05:46:12.949    3029-3029/rides.even.odd.oddorevenrides D/dalvikvm﹕ DexOpt: unable to opt direct call 0xfd9f at 0x1f in Lrides/even/odd/oddorevenrides/volleyclasses/VolleySingleton;.<init>
01-05 05:46:12.949 3029-3029/rides.偶数.oddorevenrides D/dalvikvm﹕ DexOpt:无法在Lrides/偶数/奇数/oddorevenrides/volleyclasses/VolleySingleton;中的0x1f处选择直接调用0xfd9f;。

通常这种异常(
java.lang.NoClassDefFoundError
)发生在java能够在编译时找到此类,但在运行时无法访问此类时。我没有Android方面的经验,但通常是负责运行时依赖关系的
manifest.mf
文件。尝试谷歌这个方向。谢谢@Anatoly肯定会尝试研究这个方向。如果这是一个明显的问题,它是否可能在一台设备上工作而在另一台设备上不工作?只是猜测,如果不同的设备有不同的运行时,例如Android 5和Android 4,并且Android 4依赖关系持续存在,但安卓5不存在,它可能会发生,这同样是猜测。通常这种例外(
java.lang.NoClassDefFoundError
)当java能够在编译时找到这个类,但在运行时它是不可访问的。我没有Android方面的经验,但通常
manifest.mf
文件负责运行时依赖性。尝试在这个方向上搜索。谢谢@Anatoly肯定会尝试研究这个方向。尽管它可以在一个开发上工作,但有可能吗ice但不是另一个,如果这是一个清单问题?只是猜测,如果不同设备的运行时Android 5与Android 4不同,并且Android 4依赖项持续存在,但Android 5不存在,则可能会发生这种情况,同样是猜测。根据需要,您需要继承
MultiDexApplication
或重写
attachBaseContext
。根据需要,您需要继承
多索引应用程序
或重写
attachBaseContext