• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Preparing your web services for Android and your Android app for web services @Droidcon Bucharest 2012
 

Preparing your web services for Android and your Android app for web services @Droidcon Bucharest 2012

on

  • 6,803 views

Presented by Auras Dumanovschi

Presented by Auras Dumanovschi

Statistics

Views

Total Views
6,803
Views on SlideShare
6,799
Embed Views
4

Actions

Likes
3
Downloads
127
Comments
0

1 Embed 4

https://twitter.com 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Preparing your web services for Android and your Android app for web services @Droidcon Bucharest 2012 Preparing your web services for Android and your Android app for web services @Droidcon Bucharest 2012 Presentation Transcript

    • PREPARING YOUR WEBSERVICES FOR ANDROID AND THE OTHER WAY AROUND SPEAKER: AURAS DUMANOVSCHI
    • OVERVIEW● Web services: play nice with others● Response formats● Optimization● Tips● Android: using the web data● Increasing the speed of your app
    • WEB SERVICES?WHY
    • WEB SERVICES?{ ● Offloads the data gathering, transformation and storage to a powerful server. ● Can do a lot of things in a very short time ● It’s connected to a large internetWHY pipe
    • IS THERE A 2ND CHOICE?
    • IS THERE A 2ND CHOICE? Yes!
    • IS THERE A 2ND CHOICE? Yes! Where else can you get data from?
    • IS THERE A 2ND CHOICE? Yes! Where else can you get data from? Web pages
    • IS THERE A 2ND CHOICE? Yes! Where else can you get data from? Web pages That means parsing HTML client side.
    • YEAH, SO? { ● It takes a lot of bandwidth to downloadBIGa few some web pages ● Mobile devices are usually connected to high latency networks: cell towers. Not even wi-fi is as reliable as fiber optic.PROBLEMS ● You may have to do this a lot of times just for all the data needed for a single screen
    • OK…You can do all that on a web server in less than thetime* for a request from a 3G Galaxy Nexus toreach the web server.*that’s if you don’t have the data stored in a DB andyou have to fetch it from one or more sources.
    • SO, WEB SERVICES…● Just like Q & A
    • SO, WEB SERVICES…● Just like Q & A { Q: THE REQUEST
    • SO, WEB SERVICES…● Just like Q & A { Q: THE REQUEST A: THE RESPONSE
    • SO, WEB SERVICES…● Just like Q & A { Q: THE REQUEST A: THE RESPONSE● Types: REST & SOAP;
    • SOAP● REQUEST: XML, specific format;● RESPONSE: XML, specific format;
    • REST● REQUEST: HTTP or other*;● RESPONSE: XML or JSON; any type of document you like; *HTTP is the norm. But you can also have XML or JSON requests.
    • XML VS JSON● XML: human readable and compatible with most platforms;● JSON: compact and quick to parse;
    • NO DATA ON YOUR SERVER? ● Scrape it; ● Cache it and/or store it; ● Serve the data later from the local cache;
    • SIMPLE PLAN OF A PARSER ● Start point; ● Data gathering points; ● End point ; ● Regular expressions;
    • START, DATA, END
    • FEROVIAR
    • STRUCTURING DATA● Try and return only one type of object per API call● For every object type use the same schema everywhere.● In some cases you can return less data per object, but where you have more data return it in the same format
    • STRUCTURING DATA● If your objects have many-to-many relationships with other objects remove redundanciesI.e : use person_id to identify a person andat the end of the response return all theunique persons in the current call
    • STRUCTURING DATA Use pagination!
    • BUT IF YOU CAN’T…● Add an API call that tells you if the data has been changed (timestamp, hash, integer, etc)● At least make sure you compress the response
    • ANDROID SUPPORTS GZIP, DEFLATE// REQUESTHttpUriRequest request = new HttpGet(url);request.addHeader("Accept-Encoding", "gzip");// ...httpClient.execute(request);// RESPONSEInputStream instream = response.getEntity().getContent();Header contentEncoding = response.getFirstHeader("Content-Encoding");if (contentEncoding != null &&contentEncoding.getValue().equalsIgnoreCase("gzip")) { instream = new GZIPInputStream(instream);}
    • TIPS● Build an API call that returns images in the request shape & size;● Less bandwidth required, less memory used and less CPU time spent on rendering (no more stretching/shrinking, positioning and cropping);
    • TIPS● Never trust the client;● Do your security and policy checks server side also;● Secure every call with a signature: call parameters, private key, timestamp or unique call id per session ➔ hashed;
    • ANDROID SIDE OF THINGS ● Parsing JSON: JSONObject or Jackson ● Objects vs Streaming
    • ANDROID SIDE OF THINGS ● Generate objects from the data only if you need them right then; ● In some cases (loading screens) you may need to load a lot of data for later use; ● Throw lots of data straight to a SQLite DB using TRANSACTIONS
    • WHY TRANSACTIONS?● Not just a concept borrowed from traditional *SQL databases● Uses less I/O. A whole lot less I/O.● Like 100x faster than saving each data line by line
    • REDESCOPERA ROMANIA
    • SAVING● To SQLite Databases: persistent objects with later use● To static objects: volatile objects that will only be used just this session● To parcelable objects: even more volatile objects● To SharedPreferences: persistent key-value data or singleton objects
    • CACHING● Always cache to the filesystem the images you download from the web;● That’s what the ~/cache dir is for;● Limit your bitmap memory cache and make sure you also recycle the bitmaps when you clear them from the cache;
    • PLAYING NICE WITH THE WEB SERVICE Detect unique install id: generate a GUID SharedPreferences prefs = context.getDefaultSharedPreferences(); String uniqueGUID = prefs.getString("install_guid", null); if (uniqueGUID == null) { ! uniqueGUID = UUID.randomUUID().toString() ! prefs.edit().putString("install_guid", uniqueGUID).commit(); }
    • PLAYING NICE WITH THE WEB SERVICE Detect unique device id: use ANDROID_ID String deviceId = Settings.Secure.getString(contentResolver,Settings.Se cure.ANDROID_ID);
    • PLAYING NICE WITH THE WEB SERVICE● Send debugging and app identification data in HTTP header● App Name/Version● Device manufacturer/Model/ID Helps debugging issues remotely and Allows web admins to control access to their web service
    • THANKSemail: auras@wip.rotwitter: @aurasThis presentation is available at:http://wip.ro/droidcon/auras.pdf