Android Developing RESTful Android Apps
Android Developing RESTful Android Apps
Client Applications
Virgil Dobjanschi
5/20/2010
Developing Android REST Client Applications
• View live notes and ask questions about this session on
Google Wave:
–http://bit.ly/bHNnTm
3
REST Client Applications
4
REST Client Applications
• REST: A broadly adopted architecture style
4
REST Client Applications
• REST: A broadly adopted architecture style
• A large number of REST APIs are available
4
REST Client Applications
• REST: A broadly adopted architecture style
• A large number of REST APIs are available
• Why develop them if mobile friendly web sites already exist?
4
Incorrect Implementation of REST Methods
“I haven’t failed, I’ve found 10,000 ways that don’t work.”
- Thomas Alva Edison
The Incorrect Implementation of REST Methods
Memory Storage
6
What’s wrong with this approach?
7
What’s wrong with this approach?
• The operating system may shut down the process
7
What’s wrong with this approach?
• The operating system may shut down the process
• Data is not persistently stored
7
Implementing REST Methods
“There’s a way to do it better ... find it.”
- Thomas Alva Edison
REST Method Implementation Patterns
9
REST Method Implementation Patterns
• Introducing three design patterns to handle REST methods
– Use a Service API
– Use the ContentProvider API
– Use the ContentProvider API and a SyncAdapter
9
Implementing REST Methods
Option A: Use a Service API
Option A: Use a Service API
Activity CursorAdapter
1. initiate(param) 11. Callback to registered activities
8’. ContentObserver 8”. requery
Service Helper notification
Service
3. start(param) 9. Operation complete callback
4.insert/update
Processor Content Provider
8.insert/update
5. start(param) 7. REST method complete callback
REST Method
11 6. GET/POST/PUT/DELETE
REST Method
The REST Method
12
REST Method
The REST Method
• An entity which:
– Prepares the HTTP URL & HTTP request body
– Executes the HTTP transaction
– Processes the HTTP response
12
REST Method
The REST Method
• An entity which:
– Prepares the HTTP URL & HTTP request body
– Executes the HTTP transaction
– Processes the HTTP response
• Select the optimal content type for responses
– Binary, JSON, XML
– New in Froyo: JSON parser (same org.json API)
12
REST Method
The REST Method
• An entity which:
– Prepares the HTTP URL & HTTP request body
– Executes the HTTP transaction
– Processes the HTTP response
• Select the optimal content type for responses
– Binary, JSON, XML
– New in Froyo: JSON parser (same org.json API)
• Enable the gzip content encoding when possible
12
REST Method
The REST Method
• An entity which:
– Prepares the HTTP URL & HTTP request body
– Executes the HTTP transaction
– Processes the HTTP response
• Select the optimal content type for responses
– Binary, JSON, XML
– New in Froyo: JSON parser (same org.json API)
• Enable the gzip content encoding when possible
• Run the REST method in a worker thread
12
REST Method
The REST Method
• An entity which:
– Prepares the HTTP URL & HTTP request body
– Executes the HTTP transaction
– Processes the HTTP response
• Select the optimal content type for responses
– Binary, JSON, XML
– New in Froyo: JSON parser (same org.json API)
• Enable the gzip content encoding when possible
• Run the REST method in a worker thread
• Use the Apache HTTP client
12
Option A: Use a Service API
Activity CursorAdapter
1. initiate(param) 11. Callback to registered activities
8’. ContentObserver 8”. requery
Service Helper notification
Service
3. start(param) 9. Operation complete callback
4.insert/update
Processor Content Provider
8.insert/update
5. start(param) 7. REST method complete callback
REST Method
13 6. GET/POST/PUT/DELETE
Processor
The Processor (POST & PUT)
POST
4.insert
(set STATE_POSTING)
Processor Content Provider
8.update
(clear STATE_POSTING)
REST Method
PUT
4.update
(set STATE_UPDATING)
Processor Content Provider
8.update
(clear STATE_UPDATING)
REST Method
14
Processor
The Processor (DELETE & GET)
DELETE
4.update
(set STATE_DELETING)
Processor Content Provider
8.delete
REST Method
GET
REST Method
15
Option A: Use a Service API
Activity CursorAdapter
1. initiate(param) 11. Callback to registered activities
8’. ContentObserver 8”. requery
Service Helper notification
Service
3. start(param) 9. Operation complete callback
4.insert/update
Processor Content Provider
8.insert/update
5. start(param) 7. REST method complete callback
REST Method
16 6. GET/POST/PUT/DELETE
Service
The Service
17
Service
The Service
17
Service
The Service
17
Service
The Service
17
Service
The Service
17
Option A: Use a Service API
Activity CursorAdapter
1. initiate(param) 11. Callback to registered activities
8’. ContentObserver 8”. requery
Service Helper notification
Service
3. start(param) 9. Operation complete callback
4.insert/update
Processor Content Provider
8.insert/update
5. start(param) 7. REST method complete callback
REST Method
18 6. GET/POST/PUT/DELETE
Service Helper
The Service Helper
19
Service Helper
The Service Helper
• Singleton which exposes a simple asynchronous API to be used
by the user interface
19
Service Helper
The Service Helper
• Singleton which exposes a simple asynchronous API to be used
by the user interface
• Prepare and send the Service request
– Check if the method is already pending
– Create the request Intent
– Add the operation type and a unique request id
– Add the method specific parameters
– Add the binder callback
– Call startService(Intent)
– Return the request id
19
Service Helper
The Service Helper
• Singleton which exposes a simple asynchronous API to be used
by the user interface
• Prepare and send the Service request
– Check if the method is already pending
– Create the request Intent
– Add the operation type and a unique request id
– Add the method specific parameters
– Add the binder callback
– Call startService(Intent)
– Return the request id
• Handle the callback from the service
– Dispatch callbacks to the user interface listeners
19
Option A: Use a Service API
Activity CursorAdapter
1. initiate(param) 11. Callback to registered activities
8’. ContentObserver 8”. requery
Service Helper notification
Service
3. start(param) 9. Operation complete callback
4.insert/update
Processor Content Provider
8.insert/update
5. start(param) 7. REST method complete callback
REST Method
20 6. GET/POST/PUT/DELETE
Handling the REST Method in an Activity &
Activity CursorAdapter
21
Handling the REST Method in an Activity &
Activity CursorAdapter
• Add an operation listener in onResume and remove it in onPause
21
Handling the REST Method in an Activity &
Activity CursorAdapter
• Add an operation listener in onResume and remove it in onPause
• Consider these cases:
– The Activity is still active when the request completes
– The Activity is paused then resumed and then the request
completes
– The Activity is paused when the request completes and then
Activity is resumed
21
Handling the REST Method in an Activity &
Activity CursorAdapter
• Add an operation listener in onResume and remove it in onPause
• Consider these cases:
– The Activity is still active when the request completes
– The Activity is paused then resumed and then the request
completes
– The Activity is paused when the request completes and then
Activity is resumed
• The CursorAdapter handles the ContentProvider notification by
implementing a ContentObserver
21
Option A: Use a Service API
Activity CursorAdapter
1. initiate(param) 11. Callback to registered activities
8’. ContentObserver 8”. requery
Service Helper notification
Service
3. start(param) 9. Operation complete callback
4.insert/update
Processor Content Provider
8.insert/update
5. start(param) 7. REST method complete callback
REST Method
22 6. GET/POST/PUT/DELETE
Implementing REST Methods
Option B: Use the ContentProvider API
Option B: Use the ContentProvider API
Content Provider
2. start(Intent)
Service Helper
3. startService(Intent)
7. insert/update
Service
4. start(param)
6. Process data
REST Method Processor
5. GET/POST/
24
PUT/DELETE
A Simple Pattern for the REST of us
Option C: Use a ContentProvider API and a SyncAdapter
“To have a great idea, have a lot of them.”
-Thomas Alva Edison
A Simple Pattern Using the ContentProvider API
Use a sync adapter to initiate all your REST methods
Content Provider
1.Get items that need to be synced
5. insert/
Sync Adapter update/delete
2. start(param)
4. Process
REST Method data Processor
3. GET/POST/
PUT/DELETE
26
Conclusions
“The value of an idea lies in the using of it.”
- Thomas Alva Edison
Conclusions
28
Conclusions
• Do not implement REST methods inside Activities
28
Conclusions
• Do not implement REST methods inside Activities
• Start long running operations from a Service
28
Conclusions
• Do not implement REST methods inside Activities
• Start long running operations from a Service
• Persist early & persist often
28
Conclusions
• Do not implement REST methods inside Activities
• Start long running operations from a Service
• Persist early & persist often
• Minimize the network usage
28
Conclusions
• Do not implement REST methods inside Activities
• Start long running operations from a Service
• Persist early & persist often
• Minimize the network usage
• Use a sync adapter to execute background operations which
are not time critical
– New in Froyo: Android Cloud to Device Messaging
28
Developing Android REST Client Applications
• View live notes and ask questions about this session on
Google Wave:
–http://bit.ly/bHNnTm
29