Android Libraries
In Real Life
Jolanda Verhoef
Android Developer @ Blendle
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1927942/jolanda-color-round.png)
Which libraries?
Timber
Butterknife
GSON
Universal Image Loader
OkHttp
RxJava
Mosby MVP
Dagger 2
Why this
talk?
Easy Logging
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1871738/timber.png)
Timber.d("There are %s apples", x);
Log.d(TAG, "There are " + x + " apples);
Timber.w(e, "Reason for the error");
Log.w("Reason for the error"); e.printStackTrace();
Butterknife
Easy View Binding
private TextView mTextView;
private ImageView mImageView;
private RelativeLayout mContainerView;
public void onCreate(Bundle savedInstanceState) {
mTextView = (TextView) this.findViewById(R.id.textView);
mImageView = (ImageView) this.findViewById(R.id.imageView);
mContainerView = (RelativeLayout) this.findViewById(R.id.container);
}
@Bind(R.id.textView) TextView mTextView;
@Bind(R.id.imageView) ImageView mImageView;
@Bind(R.id.container) RelativeLayout mContainerView;
private TextView mTextView;
public void onCreate(Bundle savedInstanceState) {
mTextView = (TextView) this.findViewById(R.id.textView);
mTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((TextView) v).setText("Hello World!");
}
});
}
@OnClick(R.id.textview)
public void textViewClicked(TextView tv) {
tv.setText("Hello World!");
}
GSON
Easy JSON Parsing
{
"page_preview": {
"href": "https://static.blendle.nl/...6b831ee.jpg",
"width": 412,
"height": 550
},
"id": "bnl-soigneur-20150601",
"initial_publication_time": "2015-06-01T00:00:00+00:00"
}
public class Issue {
@SerializedName("page_preview")
PagePreview pagePreview;
@SerializedName("inital_publication_date")
Date publicationDate;
String id;
public static class PagePreview {
String href;
int width;
int height;
}
}
Issue i = new Gson().fromJson(jsonString, Issue.class);
Universal Image Loader
Easy Image Loading
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1890100/Youtube_loading_symbol_1__wobbly_.gif)
Advantages
Asynchronous
Memory management
Disk caching
SOLVED PROBLEM!
OkHttp
Easy Network Requests
Request request = new Request.Builder()
.url(url)
.build();
Response response = new OkHttpClient().newCall(request).execute();
String body = response.body().string();
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(url));
HttpResponse response = client.execute(request);
String body = EntityUtils.toString(response.getEntity());
Advantages of OkHttp
Sharing sockets
Connection pooling
Transparent GZIP
Caching for repeated requests
Silent recovery
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1871752/Rx_Logo_M.png)
Reactive components
RxJava
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1923243/kiosk.png)
Browsing Newspapers & Magazines in Blendle
- Retrieving your favorites
- Retrieving popular issues
- Retrieving issues per category
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1923344/my_favourites.png)
Retrieving latest issues of your favorite titles
- Retrieve a list of urls
- Each url points to a title issue
- Concurrently retrieve issues
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1933071/rx_marbles_example_get_user_favourites.png)
Observable<List<Issue>> myObservable = mDataManager
.getUserFavourites()
.flatMap(Observable::from)
.map(UserFavourite::getLatestIssueLink)
.concatMap(this::getIssue)
.toList();
myObservable.subscribe(
this::showIssues,
this::showError);
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1933141/rx_marbles_example_get_kiosk_content.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1889914/rxjava.png)
Mosby MVP
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1889949/mvp-workflow.png)
It's all about intentions
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1923400/login1.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1923401/login2.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1936208/login3.png)
Presenter
View
public interface LoginView extends MvpView {
void showLoginLoading();
void loginSucceeded();
void loginFailed();
}
public class LoginPresenter implements MvpPresenter<LoginView> {
public void cancel() {}
public void forgotPassword() {}
public void login(String username, String password) {}
}
Complex Example
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1923441/kiosk1.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1923442/kiosk2.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1933163/kiosk4.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/360561/images/1933159/kiosk3.png)
Why a library?
Dagger 2
Dependency Injection
In software engineering, dependency injection
is a software design pattern that implements
inversion of control for resolving dependencies.
Dependency injection means giving an object
its instance variables. Really. That's it.
~ Wikipedia
DataManager mDataManager;
Analytics mAnalytics;
Session mSessionl
KioskService mKioskService;
public KioskPresenter(DataManager dataManager,
Analytics analytics, Session session,
KioskService kioskService) {
mDataManager = dataManager;
mAnalytics = analytics;
mSession = session;
mKioskService = kioskService;
}
@Inject DataManager mDataManager;
@Inject Analytics mAnalytics;
@Inject Session mSession;
@Inject KioskService mKioskService;
public KioskPresenter(Context context) {
MyApp.get(context).getSessionComponent().inject(this);
}
@Module
public class SessionModule {
@Provides
public OkHttpClient provideHttpClient() {
return new OkHttpClient();
}
@Provides
public DataManager provideDataManager(client) {
return new DataManager(client);
}
DataManager mDataManager;
Analytics mAnalytics;
Session mSessionl
KioskService mKioskService;
public KioskPresenter(Context context) {
mDataManager = DataManager.getInstance();
mAnalytics = new Analytics(context);
mSession = Session.retrieveSession();
mKioskService = new KioskService(context);
}
Which libraries?
Timber
Butterknife
GSON
Universal Image Loader
OkHttp
RxJava
Mosby MVP
Dagger 2
@lojanda
jolanda@blendle.com
Android Libraries in Real Life
By Jolanda Verhoef
Android Libraries in Real Life
- 2,092