RoboGuice – Android ve Dependency Injection
Bu yazıda beni Volley kadar etkilemesede beğendiğim ve projelerimde kullanmakta olduğum başka bir kütüphaneden bahsedeceğim, RoboGuice.
RoboGuice
EÄŸer Java EE projeleriyle uÄŸraÅŸtıysanız Dependency Injection’ın ne olduÄŸu biliyorsunuzdur. EÄŸer bilmiyorsanız size öncelikle Martin Fowler’ın ÅŸu yazısına alalım. Google Guice Java projelerinde kullanılan bir DI kütüphanesi. RoboGuice ise bu kütüphanenin Android uyarlamasıdır.
RoboGuice ise temel olarak aÅŸağıdaki nesneleri Activity nesnelerinize “inject” etmenize olanak saÄŸlar
- Activity xml dosyanızda tanımlı tüm View yapılarını. (LinerLayout, ImageView, TextView vs)
- Projenizde tanımlı tüm kaynak yapılarını. (Drawables, Strings vs)
- Android projelerinin size sağladığı servisleri (LocationManager vs)
- Application Scope’unda tanımlı olan diÄŸer nesneleri
Tüm bu işlemler sizi onCreate methodunda yaptığınız findViewById(..) işleminden kurtaracak ve projenizi daha okunabilir yapacaktır.
RoboGuice’ı projenizde kullanabilmeniz için aÅŸağıdaki maven bağımlılığını eklemeniz ya da linkteki jar dosyasını indirip libs klasörüne yüklemeniz gerekmektedir.
1 2 3 4 5 | <dependency> <groupId>org.roboguice</groupId> <artifactId>roboguice</artifactId> <version>2.0</version> </dependency> |
Bundan sonra tek yapanız gereken Activity sınıflarınızı RoboActivity sınıfından türetmektir.
Aşağıda Activity tanımının hem normal versiyonunu hem RoboGuice versiyonunu bulacaksınız.
Normal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class AndroidWay extends Activity { TextView name; ImageView thumbnail; LocationManager loc; Drawable icon; String myName; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name = (TextView) findViewById(R.id.name); thumbnail = (ImageView) findViewById(R.id.thumbnail); loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); icon = getResources().getDrawable(R.drawable.icon); myName = getString(R.string.app_name); name.setText( "Hello, " + myName ); } } |
RoboGuice
1 2 3 4 5 6 7 8 9 10 11 12 13 | class RoboWay extends RoboActivity { @InjectView(R.id.name) TextView name; @InjectView(R.id.thumbnail) ImageView thumbnail; @InjectResource(R.drawable.icon) Drawable icon; @InjectResource(R.string.app_name) String myName; @Inject LocationManager loc; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name.setText( "Hello, " + myName ); } } |
Burada dikkat etmeniz gereken kısım ilk satırdır. Gördüğünüz üzere RoboGuice ile Activity sınıfında injection yapabilmeniz için sınıfınızın RoboActivity’den türetilmesi gerekmektedir. Hemen hemen tüm Activity versyionlarının bir Robo alternatifi bulunmaktadır. ÖrneÄŸin
- ActivityGroup -> RoboActivityGroup
- FragmentActivity -> RoboFragmentAvtivity
- TabActivity -> RoboTabActivity
- Activity -> RoboActivity
Activity’ler haricinde diÄŸer tüm bean sınıflarına injection yapılabiliyor. Bean’lerinizin içine diÄŸer bean’ler haricinde uygulama genelindeki tüm Manager yapılarını da “inject” edebilirsiniz.
1 2 3 | @Inject android.app.Application.Application application; @Inject android.view.WindowManager.WindowManager windowManager; |
Bean tanımlamak için sadece Singleton scope’unu kullanabiliyorsunuz. Android uygulama yapısını düşündüğünüzde bu durum gayet normal.
1 2 | @Singleton public final class SingletonBean {} |
 Son
Tüm bu iÅŸlemleri yapmanın baÅŸka yolları’da mevcut. ÖrneÄŸin Singleton pattern yapısını kendiniz oluÅŸturabilirsiniz ya da findById methodlarını kullanabilirsiniz. Fakat sık proje yapıyorsanız ve kendinize ait bir projelerinizde aynı yapıları kullanmak yerine bir kütüphane geliÅŸtirmeyi düşünüyorsanız RoboGuice çok iÅŸinize yarayacaktır. Kütüphaneniz içerisinde tanımladığınız utility’leri ve yapıları kolaylıkla projenize entegre edebileceksiniz.
Referanslar
- RoboGuice
- RoboGuice Getting Started
- RoboGuice for dependency injection in Android applications – Tutorial
End of Line