SlideShare a Scribd company logo
Android REST-client applications:
       services approach
         Sharing experience
Case
Case
       New startup
Case
       New startup
Case
       New startup
Case
       New startup
Case
       New startup

          stores
          posts
          sends

         provides
          notifies
         suggests
Case
       New startup


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



     {
         id : 14701612,
         name : “Roman Mazur”,
         location : “Ukraine, Kyiv”,
         …
     }
How to perform requests
@Override
public void onClick(View view) {
  URLConnection connection
    = new URL(…).openConnection();
  …
}
How to perform requests
@Override
public void onClick(View view) {
  URLConnection connection
    = new URL(…).openConnection();
  …
}
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
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
Services Way
• See also
  – Google IO 2010 session
    “Developing Android REST Client Applications”
Services: our first implementation
                      Activity


           1. onStart                 4. performRequest



                ApiMethodsSupport
      (Helper for communication with service)


                          3. registerListener
            2. bind                               5. performRequest
                             (using binder)

                        Service


                            6. HTTP GET/POST/…
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?
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
How we perform requests now


@Override
public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);

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

}
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();

}
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());
    }

}
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());
    }

}
ResponseData
•   Result code
•   Status message
•   User visible message
•   Data
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
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
Service Side: Response Pipeline
                       URLConnection



   ContentHandler


   Parsed object


                    ResponseDataConverter


                                 ResponseData


                       ContentAnalyzer                         Listeners
                                                  Analyzed
                                                ResponseData
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
It’s open source
But we lack documentation :)




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

Head of Android Unit at Stanfy
Kyiv GDD co-organizer




mazur.roman@gmail.com
+Roman Mazur
@roman_mazur

More Related Content

What's hot (20)

PPSX
React introduction
Kashyap Parmar
 
PDF
Learning React - I
Mitch Chen
 
PDF
Introduce Flux & react in practices (KKBOX)
Hsuan Fu Lien
 
PDF
3rd Generation Web Application Platforms
Naresh Chintalcheru
 
PPTX
Intro to React
Eric Westfall
 
PPTX
Introduction to React JS for beginners | Namespace IT
namespaceit
 
PDF
Breaking the Server-Client Divide with Node.js and React
Dejan Glozic
 
PPTX
Introduction to React JS for beginners
Varun Raj
 
PDF
Simple REST with Dropwizard
Andrei Savu
 
PPTX
Its time to React.js
Ritesh Mehrotra
 
PDF
Think Async: Understanding the Complexity of Multithreading - Avi Kabizon & A...
DroidConTLV
 
PDF
Akka - Developing SEDA Based Applications
Benjamin Darfler
 
PDF
React & Flux Workshop
Christian Lilley
 
PDF
React.js
Łukasz Kużyński
 
PPTX
The Past Year in Spring for Apache Geode
VMware Tanzu
 
PDF
SpringMVC
Aircon Chen
 
PPTX
Enterprise java unit-2_chapter-2
sandeep54552
 
PPTX
001. Introduction about React
Binh Quan Duc
 
PPTX
React JS: A Secret Preview
valuebound
 
PPTX
REST Easy with AngularJS - ng-grid CRUD EXAMPLE
reneechemel
 
React introduction
Kashyap Parmar
 
Learning React - I
Mitch Chen
 
Introduce Flux & react in practices (KKBOX)
Hsuan Fu Lien
 
3rd Generation Web Application Platforms
Naresh Chintalcheru
 
Intro to React
Eric Westfall
 
Introduction to React JS for beginners | Namespace IT
namespaceit
 
Breaking the Server-Client Divide with Node.js and React
Dejan Glozic
 
Introduction to React JS for beginners
Varun Raj
 
Simple REST with Dropwizard
Andrei Savu
 
Its time to React.js
Ritesh Mehrotra
 
Think Async: Understanding the Complexity of Multithreading - Avi Kabizon & A...
DroidConTLV
 
Akka - Developing SEDA Based Applications
Benjamin Darfler
 
React & Flux Workshop
Christian Lilley
 
The Past Year in Spring for Apache Geode
VMware Tanzu
 
SpringMVC
Aircon Chen
 
Enterprise java unit-2_chapter-2
sandeep54552
 
001. Introduction about React
Binh Quan Duc
 
React JS: A Secret Preview
valuebound
 
REST Easy with AngularJS - ng-grid CRUD EXAMPLE
reneechemel
 

Similar to Android rest client applications-services approach @Droidcon Bucharest 2012 (20)

PDF
Netflix conductor
Viren Baraiya
 
PDF
Advanced android app development
Rachmat Wahyu Pramono
 
PDF
Android101
David Marques
 
PDF
How to Contribute to Apache Usergrid
David M. Johnson
 
PDF
Microservices and modularity with java
DPC Consulting Ltd
 
KEY
Architecting single-page front-end apps
Zohar Arad
 
PDF
Breaking Down the Monolith - Peter Marton, RisingStack
NodejsFoundation
 
PDF
Surrogate dependencies (in node js) v1.0
Dinis Cruz
 
PPTX
Sherlock Homepage - A detective story about running large web services - WebN...
Maarten Balliauw
 
PPTX
Using Modern Browser APIs to Improve the Performance of Your Web Applications
Nicholas Jansma
 
PDF
Rest with Spring
Eugen Paraschiv
 
PDF
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 
PDF
Cloud APIs Overview Tucker
Infrastructure 2.0
 
PPTX
High Performance NodeJS
Dicoding
 
PDF
JSFest 2019: Technology agnostic microservices at SPA frontend
Vlad Fedosov
 
PPTX
Windows 8 Metro apps and the outside world
Prabhakaran Soundarapandian
 
PPTX
How and why we evolved a legacy Java web application to Scala... and we are s...
Katia Aresti
 
PPT
Ajax tutorial by bally chohan
WebVineet
 
PDF
Website Monitoring with Distributed Messages/Tasks Processing (AMQP & RabbitM...
Jimmy DeadcOde
 
PPTX
Microservices: Architecture and Practice
Iron.io
 
Netflix conductor
Viren Baraiya
 
Advanced android app development
Rachmat Wahyu Pramono
 
Android101
David Marques
 
How to Contribute to Apache Usergrid
David M. Johnson
 
Microservices and modularity with java
DPC Consulting Ltd
 
Architecting single-page front-end apps
Zohar Arad
 
Breaking Down the Monolith - Peter Marton, RisingStack
NodejsFoundation
 
Surrogate dependencies (in node js) v1.0
Dinis Cruz
 
Sherlock Homepage - A detective story about running large web services - WebN...
Maarten Balliauw
 
Using Modern Browser APIs to Improve the Performance of Your Web Applications
Nicholas Jansma
 
Rest with Spring
Eugen Paraschiv
 
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 
Cloud APIs Overview Tucker
Infrastructure 2.0
 
High Performance NodeJS
Dicoding
 
JSFest 2019: Technology agnostic microservices at SPA frontend
Vlad Fedosov
 
Windows 8 Metro apps and the outside world
Prabhakaran Soundarapandian
 
How and why we evolved a legacy Java web application to Scala... and we are s...
Katia Aresti
 
Ajax tutorial by bally chohan
WebVineet
 
Website Monitoring with Distributed Messages/Tasks Processing (AMQP & RabbitM...
Jimmy DeadcOde
 
Microservices: Architecture and Practice
Iron.io
 
Ad

Android rest client applications-services approach @Droidcon Bucharest 2012

  • 1. Android REST-client applications: services approach Sharing experience
  • 3. Case New startup
  • 4. Case New startup
  • 5. Case New startup
  • 6. Case New startup
  • 7. Case New startup stores posts sends provides notifies suggests
  • 8. Case New startup REST
  • 9. REST https://api.twitter.com/1/users/show.json?screen_name=roman_mazur { id : 14701612, name : “Roman Mazur”, location : “Ukraine, Kyiv”, … }
  • 10. How to perform requests @Override public void onClick(View view) { URLConnection connection = new URL(…).openConnection(); … }
  • 11. How to perform requests @Override public void onClick(View view) { URLConnection connection = new URL(…).openConnection(); … }
  • 12. 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
  • 13. 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
  • 14. Services Way • See also – Google IO 2010 session “Developing Android REST Client Applications”
  • 15. Services: our first implementation Activity 1. onStart 4. performRequest ApiMethodsSupport (Helper for communication with service) 3. registerListener 2. bind 5. performRequest (using binder) Service 6. HTTP GET/POST/…
  • 16. 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?
  • 17. 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
  • 18. How we perform requests now @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(1, null, this); }
  • 19. 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(); }
  • 20. 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()); } }
  • 21. 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()); } }
  • 22. ResponseData • Result code • Status message • User visible message • Data
  • 23. 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
  • 24. 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
  • 25. Service Side: Response Pipeline URLConnection ContentHandler Parsed object ResponseDataConverter ResponseData ContentAnalyzer Listeners Analyzed ResponseData
  • 26. 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
  • 27. It’s open source But we lack documentation :) http://code.google.com/p/enroscar/ and we are preparing to release it on GitHub
  • 28. Thanks! Roman Mazur Head of Android Unit at Stanfy Kyiv GDD co-organizer [email protected] +Roman Mazur @roman_mazur