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 Future にラップされた結果を取得します。その応答の未来により、ヘッダー、応答コードなどにアクセスできます。

文字列の結果でそれを行う方法を示すサンプル...同じ概念がバイト配列に適用されます。

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

実際のところ、これには別のライブラリがあります。画像の読み込みにTHISを使用しました。よりシンプルで、多くのメソッドが実装されています。.showImageOnFail(R.drawable.ic_error)DisplayImageOptions 構成クラスにメソッドがあります。すべてのライブラリを調べたわけではありませんが、構成クラスがこれにどのように影響するか、showImageOnFail関数がどのように呼び出され、同じロジックを再利用して独自のロジックを追加したり、いくつかのメソッドをオーバーライドしてステータスを取得したりするかを確認できると思います。これが最初に、このライブラリが役立つという考えを得た方法です。

于 2014-05-23T14:20:25.643 に答える
-2

そのライブラリ、またはおそらく他の非同期画像読み込みライブラリを使用してこれを行う方法はありません。これは一般的な使用例ではありません。ベース ライブラリを調べてコードを変更し、ステータス コードを読み取って返す必要があります。

于 2014-05-23T15:17:45.150 に答える