0

我有一个应用程序,我在其中使用 Ion 库(https://github.com/koush/ion)。问题是我意识到我需要在加载失败时获取 http-status。

我有一个休息服务根据问题返回不同的状态,并且在应用程序中也需要有不同的逻辑。

这是休息服务的代码:

@GET
@Path("/damages/image/get")
@Produces("image/jpeg")
@Override
public Response getImage() {
    byte[] byteImage;
    try  {
        //Getting the image here
        ...
    } catch (ExceptionTypeA e) {
        return Response.status(204).entity(null).build();
    } catch (ExceptionTypeB e) {
        return Response.status(503).entity(null).build();
    }

    return Response.ok(image).build();
}

这是我用来获取图像的代码:

...                 
Ion.with(imageView)
               .error(R.drawable.ic_menu_camera)
               .load(imageUrl).setCallback(new FutureCallback<ImageView>() {

                   @Override
                   public void onCompleted(Exception ex, ImageView iv) {
                       //I need to get the HTTP-status here.
                   } 
               });
...

我也试过这个:

Ion
    .with(getApplicationContext())
    .load(imageUrl)
    .as(new TypeToken<byte[]>(){})
    .withResponse()
    .setCallback(new FutureCallback<Response<byte[]>>() {

        @Override
        public void onCompleted(Exception e, 
                 Response<Byte[]> result) {
               //I never get here                           
        }
    });

使用上面的代码,我得到以下异常的错误: java.lang.NoSuchMethodError: com.koushikdutta.ion.gson.GsonSerializer

你对我如何解决这个问题有什么建议吗?另一个库还是我做错了?

解决方案:

我的解决方案是用AndroidAsync库重写它。这是代码:

AsyncHttpClient.getDefaultInstance().getByteBufferList(imageUrl, new
            AsyncHttpClient.DownloadCallback() {

        @Override
        public void onCompleted(Exception e, AsyncHttpResponse source,
                ByteBufferList result) {

               int httpStatus = source.getHeaders().getHeaders().getResponseCode();
               byte[] byteImage = result.getAllByteArray();
               Bitmap bitmapImage = BitmapFactory.decodeByteArray(byteImage, 0,
                   byteImage.length);
               theImageViewIWantToSet.setImageBitmap(bitmapImage);

               if(httpStatus == 200) {
                   //Do something
               } else {
                   //Do something else
               }
        }
    }
}); 
4

3 回答 3

6

调用 setCallback() 后,使用 .withResponse() 将结果包装在 Response 未来中。该响应未来将允许您访问标头、响应代码等。

向您展示如何使用字符串结果的示例......同样的概念适用于字节数组。

https://github.com/koush/ion#viewing-received-headers

Ion.with(getContext())
.load("http://example.com/test.txt")
.asString()
.withResponse()
.setCallback(new FutureCallback<Response<String>>() {
    @Override
    public void onCompleted(Exception e, Response<String> result) {
        // print the response code, ie, 200
        System.out.println(result.getHeaders().getResponseCode());
        // print the String that was downloaded
        System.out.println(result.getResult());
    }
});

请注意,这对于 ImageView 加载是不可能的,因为由于缓存命中等原因,ImageView 加载可能根本不会访问网络。

于 2014-05-25T02:34:07.293 回答
0

事实上,还有一个其他的图书馆。我用这个来加载图像。它更简单,有很多实现的方法。DisplayImageOptions 配置类中有一个方法.showImageOnFail(R.drawable.ic_error)。我没有浏览所有库,但我想你可以看到配置类如何影响这一点以及showImageOnFail函数如何被调用并重用相同的逻辑来添加你自己的逻辑或覆盖某些方法来获取你的状态。这就是我最初认为这个库可以帮助你的想法。

于 2014-05-23T14:20:25.643 回答
-2

使用该库或任何其他异步图像加载库都无法做到这一点。这不是一个常见的用例。您必须查看基础库并修改代码以读取状态代码并返回它。

于 2014-05-23T15:17:45.150 回答