1

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

volleyQueueInstance = VolleySingleton.getInstance(getApplicationContext());

以下是我的VolleySingleton

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

但是我的应用程序在启动时崩溃,并显示以下堆栈跟踪,说明没有找到类的类定义VolleySingleton

java.lang.NoClassDefFoundError: rides.even.odd.oddorevenrides.volleyclasses.VolleySingleton$1
        at rides.even.odd.oddorevenrides.volleyclasses.VolleySingleton.<init>(VolleySingleton.java:25)
        at rides.even.odd.oddorevenrides.volleyclasses.VolleySingleton.getInstance(VolleySingleton.java:44)
        at rides.even.odd.oddorevenrides.MyApplication.instantiateVolleyQueue(MyApplication.java:35)
        at rides.even.odd.oddorevenrides.MyApplication.onCreate(MyApplication.java:31)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
        at android.app.ActivityThread.access$1300(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

我对 java 和 android 还很陌生,无法弄清楚为什么它找不到类。据我了解,它能够找到该类,但异常发生在我试图定义的构造函数内部mImageLoader。不过我不确定。任何帮助将非常感激。

更新

好的,我尝试使用另一台设备(Samsung s4)启动该应用程序,该应用程序运行良好。但是当我用另一台设备(三星谷歌 Nexus S)尝试它时,它会因上述堆栈跟踪而崩溃。

更新#2

我错过了上面堆栈跟踪中的一些日志条目,也许这可以帮助弄清楚发生了什么。

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
4

1 回答 1

4

好的,经过数小时的研究,我终于能够解决它。这里的问题是MultiDex支持。我在我的应用程序中获得了部分多索引支持

multiDexEnabled true

在我的 build.gradle 文件中,但我的应用程序正在扩展Application类。

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

@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>
于 2016-01-05T01:20:36.710 回答