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
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
mazur.roman@gmail.com
+Roman Mazur
@roman_mazur