如何在Android库中使用volley

时间:2016-04-18 20:52:53

标签: android android-volley android-library

我有一个使用凌空库的项目。 我有一个MyApplication课程:

public class MyApplication extends Application {
    public static final String TAG = MyApplication.class
            .getSimpleName();

    private RequestQueue mRequestQueue;

    private static MyApplication mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }

        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req, String tag) {
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }

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

    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

现在在我的项目中使用它,我在Manifest文件中添加了类名。

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".MyApplication"
        >

一切都很好。

来到主要问题,我也在制作一个我需要使用凌空的图书馆。 在我的库中,我再次创建了一个MyApplication类,并在清单中添加了应用程序名称。我还在清单中添加了Internet权限。

但是在我调用函数的时候,它给了我空引用错误。

Attempt to invoke virtual method 'com.android.volley.Request com.android.volley.RequestQueue.add(com.android.volley.Request)' on a null object reference

我的问题:

a)我们可以在我们的库中使用volley。正确?

b)如果是,为什么它会显示错误?如果否,那么我该如何与服务器进行交互?

由于我打算制作maven repo,我无法在主项目文件中进行更改。

我尝试将项目的Manifest中的应用程序名称更改为librarie的MyApplication类。在那种情况下,它能够连接到服务器。

但是,如果用户已经更改了自定义类的应用程序名称,那么在这种情况下如何实现我的目标呢?

我也尝试过单身类,它也向我显示了同样的错误。

由于

2 个答案:

答案 0 :(得分:0)

你应该停止制作扩展应用的单身人士。这是不好的做法。做类似的事情:

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

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

        private MySingleton(Context context) {
            mCtx = context;
            mRequestQueue = getRequestQueue();
            mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {

                private final LruCache<String, Bitmap>
                        cache = new LruCache<String, Bitmap>(20);

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

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

        public RequestQueue getRequestQueue() {
            if (mRequestQueue == null) {
                mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
            }
            return mRequestQueue;
        }

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

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

        public ImageLoader getImageLoader() {
            return mImageLoader;
        }

        public void cancelPendingRequests(Object tag){
            if(mRequestQueue != null){
                mRequestQueue.cancelAll(tag);
            }
        }

        public static boolean canConnect(Context context){
            ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo info = manager.getActiveNetworkInfo();
            if(info != null && info.isConnected()) return true;
            return false;
        }
    }

并称之为MySingleton.getInstance(context) .... 例如。 MySingleton.getInstance(this).addToRequestQueue(request); 您也不需要像这样在清单中声明任何内容。

答案 1 :(得分:0)

RequestQueue应该是应用程序单例,因此您无需在库中“锁定”它。而是定义一些未来应用程序必须提供的接口才能开始使用您的库。

interface RequestQueueProvider {
   RequestQueue getRequestQueue();
}

因此,应用程序必须将一些实现传递给库初始化代码,某些类构造函数或其他任何内容。 Apllication还可以使用此RequestQueue来创建自己的请求。