koush / ion

Android Asynchronous Networking and Image Loading
Other
6.29k stars 1.03k forks source link

Trying to load image directly into ImageView AND get the HTTP response code #243

Open hoda0013 opened 10 years ago

hoda0013 commented 10 years ago

I am currently loading an image directly in to an ImageView using the following code:

Ion.with(context) .load(url) .addHeader(HEADER_AUTHORIZATION, mUser.getBearerToken()) .withBitmap() .placeholder(R.drawable.ic_launcher) .error(R.drawable.ic_drawer) .intoImageView(imageView);

In certain instances our server will return an http response code of 302 when the above call is performed. I need a way of checking the response code when using the call above but I could not figure out a way of doing this. Is it possible to use the .withResponse() method inserted into the code above so that I can analyze the response code? Thank you (I love this library BTW!)

nschwermann commented 10 years ago

If you haven't disabled redirects then ion will automatically follow a 302 and you'll still ultimately end up with a 200.

I don't think the withResponse is an option for loading bitmaps (don't see why not) but you can you onHeaders to see the status codes for sure!

hoda0013 commented 10 years ago

I added onHeaders() to my code but it doesn't seem to ever hit my HeadersCallback. Here's what my call looks like:

    Ion.with(context)
            .load(url)
            .onHeaders(new HeadersCallback() {
                @Override
                public void onHeaders(RawHeaders headers) {
                    Log.i("LOG", "LOG");
                }
            })
            .setLogging("SETLOGGING", Log.VERBOSE)
            .addHeader(HEADER_AUTHORIZATION, mUser.getBearerToken())
            .withBitmap()
            .placeholder(R.drawable.ic_launcher)
            .error(R.drawable.ic_drawer)
            .intoImageView(imageView);

When I include .onHeaders() my error image ends up getting loaded. If I remove .onHeaders() my image loads normally over the network. I set logging and here's what I'm getting in my log when onHeaders() is included and the error image loads:

05-28 14:38:37.869 26375-26400/com.kineticdata.kineticresponse D/SETLOGGING﹕ (0 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: Executing request. 05-28 14:38:37.869 26375-26400/com.kineticdata.kineticresponse V/SETLOGGING﹕ (1 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: Resolving domain and connecting to all available addresses 05-28 14:38:37.869 26375-26400/com.kineticdata.kineticresponse D/SETLOGGING﹕ (231 ms) https://kinetic-response.herokuapp.com/api/v1/issues/77dee3fa-4d9b-4e3c-89d2-df8e952da23c/uploads/061d8ea0-e456-43ca-993f-fc3e10233bb8?style=thumb: Recycling keep-alive socket 05-28 14:38:37.959 26375-26400/com.kineticdata.kineticresponse V/SETLOGGING﹕ (89 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: socket connected 05-28 14:38:37.959 26375-26400/com.kineticdata.kineticresponse V/SETLOGGING﹕ (90 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: GET /uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002 HTTP/1.1 Host: kinetic-response-dev.s3.amazonaws.com Accept-Encoding: gzip, deflate Connection: keep-alive Accept: /_ User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2; Nexus 5 Build/KOT49H) 05-28 14:38:37.959 26375-26400/com.kineticdata.kineticresponse V/SETLOGGING﹕ (90 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: request completed 05-28 14:38:38.049 26375-26400/com.kineticdata.kineticresponse V/SETLOGGING﹕ (181 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: Received headers: HTTP/1.1 200 OK x-amz-id-2: J/qOXXVHa2l+eJjSDNLPceepZt00TzlVWPs/AusxZADNUhYgyHF9wXM+uGCRRkJe x-amz-request-id: AB2D9F1EF5235B93 Date: Wed, 28 May 2014 19:39:53 GMT Last-Modified: Tue, 27 May 2014 18:47:18 GMT ETag: "4ec9d54fb9dde6b59a5c54c991fccc0a" Accept-Ranges: bytes Content-Type: image/jpeg Content-Length: 16128 Server: AmazonS3 05-28 14:38:38.049 26375-26400/com.kineticdata.kineticresponse D/SETLOGGING﹕ (182 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: Caching response 05-28 14:38:38.059 26375-26400/com.kineticdata.kineticresponse V/SETLOGGING﹕ (183 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: Final (post cache response) headers: HTTP/1.1 200 OK x-amz-id-2: J/qOXXVHa2l+eJjSDNLPceepZt00TzlVWPs/AusxZADNUhYgyHF9wXM+uGCRRkJe x-amz-request-id: AB2D9F1EF5235B93 Date: Wed, 28 May 2014 19:39:53 GMT Last-Modified: Tue, 27 May 2014 18:47:18 GMT ETag: "4ec9d54fb9dde6b59a5c54c991fccc0a" Accept-Ranges: bytes Content-Type: image/jpeg Content-Length: 16128 Server: AmazonS3 05-28 14:38:38.059 26375-26400/com.kineticdata.kineticresponse D/SETLOGGING﹕ (183 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: Connection successful 05-28 14:38:38.059 26375-26400/com.kineticdata.kineticresponse E/SETLOGGING﹕ (184 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: exception during response 05-28 14:38:38.059 26375-26400/com.kineticdata.kineticresponse E/SETLOGGING﹕ Not all data was consumed by Util.emitAllData java.lang.RuntimeException: Not all data was consumed by Util.emitAllData at com.koushikdutta.async.Util.emitAllData(Util.java:45) at com.koushikdutta.async.FilteredDataEmitter.onDataAvailable(FilteredDataEmitter.java:50) at com.koushikdutta.async.Util.emitAllData(Util.java:20) at com.koushikdutta.async.FilteredDataEmitter.onDataAvailable(FilteredDataEmitter.java:50) at com.koushikdutta.async.http.ResponseCacheMiddleware$BodyCacher.onDataAvailable(ResponseCacheMiddleware.java:431) at com.koushikdutta.async.Util.emitAllData(Util.java:20) at com.koushikdutta.async.FilteredDataEmitter.onDataAvailable(FilteredDataEmitter.java:50) at com.koushikdutta.async.http.filter.ContentLengthFilter.onDataAvailable(ContentLengthFilter.java:33) at com.koushikdutta.async.Util.emitAllData(Util.java:20) at com.koushikdutta.async.AsyncNetworkSocket.onReadable(AsyncNetworkSocket.java:171) at com.koushikdutta.async.AsyncServer.runLoop(AsyncServer.java:725) at com.koushikdutta.async.AsyncServer.run(AsyncServer.java:583) at com.koushikdutta.async.AsyncServer.access$700(AsyncServer.java:36) at com.koushikdutta.async.AsyncServer$13.run(AsyncServer.java:531) 05-28 14:38:38.059 26375-26400/com.kineticdata.kineticresponse V/SETLOGGING﹕ (186 ms) http://kinetic-response-dev.s3.amazonaws.com/uploads/files/061d8ea0-e456-43ca-993f-fc3e10233bb8/thumb/IMG_20140525_153121.jpg?AWSAccessKeyId=AKIAJ5DGXDOJRFFM6JHQ&Signature=jjsOiUYU9ywtOwLRI2wKQZ5mrds%3D&Expires=1401306002: closing out socket (exception)

Any ideas on what could be causing the RunTimeException? Thanks.

koush commented 10 years ago

Yeah, this is a tricky area. Since the image may be cached, a network call may never be made, hence no headers. I'm guessing that is why the callback is not hit. onHeaders should work (clear the cache).

There's no way to get a response, on a cache hit. Let me see if I can fix that. Will need to cache headers and stuff.

hoda0013 commented 10 years ago

So I deleted my app (which I am assuming clears the cache) and reinstalled and tried to make a network call like I described above using the .onHeaders(new HeaderCallback(){...}) method. Even on the first run through where nothing could be cached I was still not seeing the HeaderCallback get hit. I tried again with .noCache() also included and had the same issue where HeaderCallback was not getting hit. Not sure if that helps, but that was my experience after doing some testing.

koush commented 10 years ago

K will investigate