Mobile Zone is brought to you in partnership with:

http://www.technotalkative.com/about/ Paresh has posted 21 posts at DZone. You can read more from them at their website. View Full User Profile

How to Become a Lazy but Productive Android Developer

12.16.2013
| 14022 views |
  • submit to reddit

I am sure you might be wondering and thinking about the title of the post :), but yes, the title is perfectly suited to developers. As far as I know, we Android developers are lazy in writing code like findViewById(), click listeners, etc. So, how can we optimize throughput time for writing the business logic for the app and avoid such code to write? Let’s be lazy but productive Android developers. How? Well, that’s what I am going to write about.

There are many 3rd party libraries and frameworks available, either we don’t know about it or we haven’t used or we have defined our own libraries or we haven’t thought about to use such libraries due to ‘n’ number of reasons. If we use some of them in Android app development then we could achieve tasks like providing compatibility, cool and polished UI, clean code, etc. So I would be exploring more about such libraries which may help novice and experienced developers.

Let’s talk about Dependency Injection libraries today.

What is Dependency Injection?

Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it possible to change them, whether at run-time or compile-time. [Source: Wikipedia]

Some of the popular and widely used Dependency Injection Libraries are:

android dependency injection

RoboGuice:

roboguice

roboguice

Roboguice is a dependency injection framework for Android applications that brings the simplicity and ease of Dependency Injection to Android, using Google’s own Guice library. It smoothes out some of the wrinkles in your Android app development experience make things simple and fun. Do you always forget to check for null when you getIntent().getExtras()? RoboGuice 2 will help you. Think casting findViewById() to a TextView shouldn’t be necessary? RoboGuice is on it.

Using RoboGuice, you can inject your View, Resource, System Service, or any other object. RoboGuice can help you to slim down application code. Less code means fewer chances of issues/bugs and can help you to save efforts required to write or modify particular code in a project. It helps you to generate readable code which could be easier to follow.

Let’s look at different usage of the RoboGuice library.

Usage of RoboGuice Library:

  • Views Injection:: To initialize views, use @InjectViews, for example: @InjectView(R.id.textView1) TextView textView1;
  • Resources Injection: To initialize and get resources, use @InjectResources, for example: @InjectResource(R.string.app_name) String name;
  • System services Injection: To initialize and access system services, use @Inject, for example: @Inject LayoutInflater inflater;
  • POJO object Injection: To inject and initialize POJO object, use @Inject, for example: @Inject Foo foo;

Installation

To use RoboGuice, you need to download following JAR files and add them to your classpath:

Let’s look at an example of general activity code:

Example

public class TestActivity extends Activity{
 
    TextView textView1;
    TextView textView2;
    ImageView imageView1;
    String name;
    Drawable icLauncher;
    LocationManager locManager;
    LayoutInflater inflater;
    NotificationManager notifyManager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_test);
 
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);
        imageView1 = (ImageView) findViewById(R.id.imageView1);
        name = getString(R.string.app_name);
        icLauncher = getResources().getDrawable(R.id.ic_launcher);
        locManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
        inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        notifyManager = (NotificationManager) getSystemService(Activity.NOTIFICATION_SERVICE);
 
        textView1.setText("Hello World! RoboGuice demo");
 
    }
}

Let’s check the magic of RoboGuice and let’s slim down the code.

Using RoboGuice

To use RoboGuice for the dependency injection, you are required to extends either RoboActivity or RoboFragment.
public class TestActivity extends RoboActivity{
 
    @InjectView(R.id.textView1) TextView textView1;
    @InjectView(R.id.textView2) TextView textView2;
    @InjectView(R.id.imageView1) ImageView imageView1;
    @InjectResource(R.string.app_name) String name;
    @InjectResource(R.drawable.ic_launcher) Drawable icLauncher;
    @Inject LocationManager locManager;
    @Inject LayoutInflater inflater;
    @Inject NotificationManager notifyManager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_test);
 
        textView1.setText(name);
 
    }
}

Now I am sure you could realize benefits of using RoboGuice, so let’s talk about benefits:

Benefits of Using RoboGuice

  • No need to initialize views, if you want then Inject it using @InjectViews
  • No need to initialize System service. If you need then Inject it using @Inject
  • No need to initialize Drawable, string and other resources. If you require then Inject it using @InjectResource
  • All of these above practices helps you to slim down the code.
  • Less code => Less chances of bugs/issues
  • Less code => Android developer can save coding efforts and can focus fully on actual business logic of android app

RoboGuice and ActionBarSherlock

As I mentioned earlier, in alert box you are required to extend either RoboActivity or RoboFragment to use RoboGuice in either Activity or Fragment particularly. But what if you have included ActionBarSherlock in your project to manage compatibility? The problem is you have extended either SherlockActivity or SherlockFragmentActivity for your activity or fragment particularly and now the situation is we could not use RoboGuice with ActionBarSherlock.

But There is one solution: You have to define custom base classes for Activities and Fragments to use RoboGuice and ActionBarSherlock both.

You can download base classes here: https://github.com/rtyley/roboguice-sherlock or download a JAR file for the same: RoboGuice+Sherlock.jar, include either of them in your project.

I think I am done exploring everything about RoboGuice and its usage/benefits in Android apps. If any point is left out, then please comment. In the next article, I will be exploring another library that can make you lazy but a productive android developer :)


Published at DZone with permission of its author, Paresh Mayani. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Void Main replied on Mon, 2013/12/16 - 1:32pm

AA is way faster, I just think RoboGuice was too slow, Last I used it was one year ago, Don't know if there is any improvement on it.

Paresh Mayani replied on Tue, 2013/12/17 - 12:25am

Yes RoboGuice is not great if you are thinking about performance, the reason being is that its based on the reflection feature of JAVA. I will exploring more in part-2 article of this "lazy android developer" article series.

Void Main replied on Sun, 2014/01/05 - 12:25pm in response to: Paresh Mayani

cannot wait to see your part2.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.