In the previous Volley-related post, I mentioned some reservations in some more complex use cases.
Volley, in its current state, is not convenient when you need to:
- Add headers to your requests
- Add a body the some requests
- Customize ImageRequest (for authentication…)
- Define a common behavior to all your requests
The code presented here is a shot at trying to solve these issues. It can be found here: https://github.com/smaspe/ExtVolley
No modification is made to Volley, so this comes as an compatible addition.
ImageLoader
The ImageLoader
in Volley uses ImageRequests
. These Requests
cannot be modified, as ImageRequest
is explicitly instanciated. The solution here is to make a new ImageLoader
that takes a factory as a parameter. I am not quite satisfied with the solution I have come up with so far, as there is a lot of duplicate code from ImageLoader
(which obviously was not designed to be extended).
The relevant parts:
The factory is quite simple, it just needs to provide a ImageRequest
.
The default ImageRequestFactory
is simply
Requests
DelegatingRequest
is a class that extends Request
, adds getters and setters for body and headers, and delegates the handling of the network response to a NetworkResponseParser
.
This way, the DelegatingRequest
is the only type of request required, it is therefore easier to extend for specific behaviors.
NetworkResponseParser
is in charge of handling the actual work, making it easy to add support to new Response types.
For instance, a String
parser looks like that
Examples
ImageLoader
As you can see, it is now easy to create an ImageLoader
that can use any ImageRequest
object.
Request
An example of the use of DelegatingRequest
It is possible to add headers, content values, to change the body and the body content type.
Conclusion
I don’t find Volley particularly easy to extend, in particular the image loader part. I expect the dev team to come up with a better solution for this quite soon.
I also find the current Request
extension system quite clumsy, lots of code can easily get duplicated as there is no separation between the request typing and the response parsing. I find (obviously) my solution rather more elegant, and more importantly more easily extendable.