28
Android REST-client applications: services approach Sharing experience

Android rest client applications-services approach @Droidcon Bucharest 2012

Embed Size (px)

DESCRIPTION

Presented by Roman Mazur

Citation preview

Page 1: Android rest client applications-services approach @Droidcon Bucharest 2012

Android REST-client applications: services approach

Sharing experience

Page 2: Android rest client applications-services approach @Droidcon Bucharest 2012

Case

Page 3: Android rest client applications-services approach @Droidcon Bucharest 2012

Case

New startup

Page 4: Android rest client applications-services approach @Droidcon Bucharest 2012

Case

New startup

Page 5: Android rest client applications-services approach @Droidcon Bucharest 2012

Case

New startup

Page 6: Android rest client applications-services approach @Droidcon Bucharest 2012

Case

New startup

Page 7: Android rest client applications-services approach @Droidcon Bucharest 2012

Case

New startup

stores

posts sends

provides

notifies suggests

Page 8: Android rest client applications-services approach @Droidcon Bucharest 2012

Case

New startup

REST

Page 9: Android rest client applications-services approach @Droidcon Bucharest 2012

REST

https://api.twitter.com/1/users/show.json?screen_name=roman_mazur

{

id : 14701612,

name : “Roman Mazur”,

location : “Ukraine, Kyiv”,

}

Page 10: Android rest client applications-services approach @Droidcon Bucharest 2012

How to perform requests

@Override

public void onClick(View view) {

URLConnection connection

= new URL(…).openConnection();

}

Page 11: Android rest client applications-services approach @Droidcon Bucharest 2012

How to perform requests

@Override

public void onClick(View view) {

URLConnection connection

= new URL(…).openConnection();

}

Page 12: Android rest client applications-services approach @Droidcon Bucharest 2012

How to perform requests

• Obviously: not in the main (GUI) thread

• Using either URLConnection or HttpClient

– both have pros and cons

• Choose context: Activity vs. Service

Page 13: Android rest client applications-services approach @Droidcon Bucharest 2012

Why not to use activities?

• User controls activity lifecycle

• When all your activities are in background your process is a candidate for killing

• You’ll lose your data

Page 15: Android rest client applications-services approach @Droidcon Bucharest 2012

Services: our first implementation

Activity

ApiMethodsSupport (Helper for communication with service)

Service

1. onStart

2. bind 3. registerListener (using binder)

4. performRequest

5. performRequest

6. HTTP GET/POST/…

Page 16: Android rest client applications-services approach @Droidcon Bucharest 2012

Services: our first implementation

• Main problem: rotations :)

– we register listener in onStart and remove it in onStop

– what if response is received while we are rotating the screen?

Page 17: Android rest client applications-services approach @Droidcon Bucharest 2012

Current implementation

• Loaders! – are awesome since they are not recreated in case

of configuration changes (at least in most cases)

• Custom loader – binds to the service

– registers listener

– performs request

– gets the result

– unbinds

Page 18: Android rest client applications-services approach @Droidcon Bucharest 2012

How we perform requests now

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

getLoaderManager().initLoader(1, null, this);

}

Page 19: Android rest client applications-services approach @Droidcon Bucharest 2012

How we perform requests now

@Override

public Loader<ResponseData<Profile>>

onCreateLoader(int id, Bundle args) {

return

new SimpleRequestBuilder<Profile>(getActivity()) { }

.setUrl("https://api.twitter.com/1/users/show.json")

.addParam("screen_name", "TwitterAPI")

.getLoader();

}

Page 20: Android rest client applications-services approach @Droidcon Bucharest 2012

How we perform requests now

@Override

public void

onLoadFinished(Loader<ResponseData<Profile>> loader,

ResponseData<Profile> data) {

if (data.isSuccessful()) {

Profile profile = data.getModel();

text1.setText(profile.getName());

text2.setText(profile.getDescription());

}

}

Page 21: Android rest client applications-services approach @Droidcon Bucharest 2012

How we perform requests now

@Override

public void

onLoadFinished(Loader<ResponseData<Profile>> loader,

ResponseData<Profile> data) {

if (data.isSuccessful()) {

Profile profile = data.getModel();

text1.setText(profile.getName());

text2.setText(profile.getDescription());

}

}

Page 22: Android rest client applications-services approach @Droidcon Bucharest 2012

ResponseData

• Result code

• Status message

• User visible message

• Data

Page 23: Android rest client applications-services approach @Droidcon Bucharest 2012

Activity Side

• Request builder creates a request description

• Description is passed to a service

– a) as an Intent

– b) with a service binder method performRequest

Page 24: Android rest client applications-services approach @Droidcon Bucharest 2012

Service Side

• Either enqueues description processing or performs it in the worker thread using AsyncTask

• Request description builds URLConnection

• Input thread is read, parsed; result is analyzed and then delivered to listeners

Page 25: Android rest client applications-services approach @Droidcon Bucharest 2012

Service Side: Response Pipeline

ContentHandler

URLConnection

ResponseDataConverter

ContentAnalyzer

Parsed object

ResponseData

Listeners

Analyzed ResponseData

Page 26: Android rest client applications-services approach @Droidcon Bucharest 2012

Conclusions

• Power – requests processing can be easily managed

– requests can triggered by notifications and AlarmManager

• Simplicity – not much to learn if you are familiar with Android

loaders

• Caveats – currently not everything is easy to customize

Page 27: Android rest client applications-services approach @Droidcon Bucharest 2012

It’s open source But we lack documentation :)

http://code.google.com/p/enroscar/ and we are preparing to release it on GitHub

Page 28: Android rest client applications-services approach @Droidcon Bucharest 2012

Thanks!

Roman Mazur

Head of Android Unit at Stanfy

Kyiv GDD co-organizer

[email protected]

+Roman Mazur

@roman_mazur