我有一个使用凌空库的项目。
我有一个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
类。在那种情况下,它能够连接到服务器。
但是,如果用户已经更改了自定义类的应用程序名称,那么在这种情况下如何实现我的目标呢?
我也尝试过单身类,它也向我显示了同样的错误。
由于
答案 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
来创建自己的请求。