AndroidManifestのapplicationタグにクラスを2つ指定したくなった時にやったこと
もともとActiveAndroidを使っていたので下記のようなManifestでした。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.nilab.dribbbleviewer" > <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:name="com.activeandroid.app.Application" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <meta-data android:name="AA_DB_NAME" android:value="sqlite.db" /> <meta-data android:name="AA_DB_VERSION" android:value="1" /> <activity android:name="com.nilab.dribbbleviewer.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
ここからVolleyのシングルトンクラスを追加しようと下記クラスを追加(参Android working with Volley Library)
package com.nilab.dribbbleviewer; import android.app.Application; import android.text.TextUtils; import com.activeandroid.ActiveAndroid; import com.activeandroid.Configuration; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.Volley; public class AppController extends Application { public static final String TAG = AppController.class.getSimpleName(); private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static AppController mInstance; @Override public void onCreate(){ super.onCreate(); mInstance = this; } public static synchronized AppController getInstance(){ return mInstance; } public RequestQueue getRequestQueue(){ if(mRequestQueue == null){ mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } return mRequestQueue; } public ImageLoader getImageLoader(){ getRequestQueue(); if(mImageLoader == null){ mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache()); } return mImageLoader; } 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クラスを継承したクラスを下記のように書き換えて動きました。
Manifestはapplicationタグの中を書き換え。
<application android:name="com.nilab.dribbbleviewer.AppController" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name="com.nilab.dribbbleviewer.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
AppControllerはonCreateの中と新たにメソッドを一つ追加。
public class AppController extends Application { @Override public void onCreate(){ super.onCreate(); Configuration.Builder builder = new Configuration.Builder(getBaseContext()); builder.setCacheSize(1024*1024*4); builder.setDatabaseName("sqlite.db"); builder.setDatabaseVersion(1); ActiveAndroid.initialize(builder.create(), true); mInstance = this; } @Override public void onTerminate(){ super.onTerminate(); ActiveAndroid.dispose(); }
以上。
美しくないですね。。。