相关疑难解决方法(0)

Android网络库的比较:OkHTTP,Retrofit和Volley

来自iOS开发人员学习Android的两部分问题,研究Android项目,该项目将发出从JSON到图像到音频和视频的流媒体下载的各种请求:

  1. 在iOS上,我广泛使用了AFNetworking项目.是否有适用于Android的等效库?

  2. 我已经阅读了OkHTTP和Square的改造,以及Volley,但还没有与他们一起开发的经验.我希望有人可以提供一些最佳使用案例的具体例子.从我所看到的,看起来OkHTTP是三者中最强大的,并且可以处理这个项目的要求(如上所述).

networking android android-networking retrofit

563
推荐指数
7
解决办法
23万
查看次数

我们如何使用Retrofit 2处理不同的响应类型?

我有一个webservice,它返回一个序列化的MyPOJO对象列表:

[
  { //JSON MyPOJO },
  { //JSON MyPOJO }
]
Run Code Online (Sandbox Code Playgroud)

要么是错误对象:

{  
  'error': 'foo', 
  'message':'bar' 
}
Run Code Online (Sandbox Code Playgroud)

使用retrofit2,我该如何检索错误?

Call<List<MyPOJO>> request = ...
request.enqueue(new Callback<List<MyPOJO>>() {
  @Override
  public void onResponse(Response<List<MyPOJO>> response) {
      if (response.isSuccess()) {
          List<MyPOJO> myList = response.body();
          // do something with the list...
      } else {
          // server responded with an error, here is how we are supposed to retrieve it
          ErrorResponse error = ErrorResponse.fromResponseBody(apiService.getRetrofitInstance(), response.errorBody());
          processError(error);
          // but we never get there because GSON deserialization throws an error …
Run Code Online (Sandbox Code Playgroud)

android retrofit2

25
推荐指数
2
解决办法
2万
查看次数

用于Retrofit 2的定制转换器

我必须处理动态JSON响应.

之前,我正在使用类和注释如下:

public class ChatResponse {

    @SerializedName("status")
    private int status;

    @SerializedName("error")
    private String error;

    @SerializedName("response")
    private Talk response;

    public int getStatus() {
        return status;
    }

    public String getError() {
        return error;
    }

    public Talk getResponse() {
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

当状态为1(成功)时,onResponse会触发,我可以获得ChatResponse对象.但是,当状态为0时,JSON表示中的响应为false,并且失败(onFailure被触发).

我想创建我的自定义转换器,这个问题有一个很好的例子,但该示例适用于Retrofit 1.

我必须创建一个扩展的类Converter.Factory,但我不知道如何覆盖此类的方法.

其实我有下一个:

@Override
public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {

    return super.fromResponseBody(type, annotations);
}

@Override
public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) {

    return super.toRequestBody(type, annotations);
} …
Run Code Online (Sandbox Code Playgroud)

android json converter retrofit2

21
推荐指数
2
解决办法
3万
查看次数

调用OnFailure并抛出IOException但发布了数据

这是我的网络请求示例

networkAPI.postData(myData).enqueue(new Callback<MyResponse>() {
    @Override
    public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
         if (response.code() == 201) {
             // success
         }
    }
    @Override
    public void onFailure(Call<MyResponse> call, Throwable t) {

    }
});
Run Code Online (Sandbox Code Playgroud)

这是我应该只拨打一次的请求,因为我有一次可用的优惠券代码.如果我立即关闭我的网络连接或者在调用此方法后立即断开连接,那么它会移动到onFailure带有IOExceptionthrowable的方法,这通常是指连接错误,但重点是发布到服务器的数据和使用的凭证代码,问题是onFailure方法在这里被称为.

我确信它不是解析失败,因此我也尝试使用它Void.为什么onResponse即使在发布数据后也没有调用.如何克服这种情况?

java android retrofit

12
推荐指数
1
解决办法
411
查看次数

使用翻新处理变量JSON

我正在从后端(使用Retrofit)获取数据,其中之一的键包含一个JSON对象作为其值。我为此对象编写了以下类结构:

public class NotificationData {
    @SerializedName("photo_pk")
    @Expose
    private int photoPk;
    @SerializedName("gallery_pk")
    @Expose
    private int galleryPk;
    @SerializedName("user_pk")
    @Expose
    private int userPk;
}
Run Code Online (Sandbox Code Playgroud)

问题在于此对象的值可以是nullor,如果不是null,则可以包含字段photo_pkor gallery_pk或or可以是gallery_pkand user_pk。如果后端将发送所有字段并为存在的字段和null其他字段提供值,那么它将工作得很好。但是由于某些字段即将到来,而有些字段则没有,根据情况,我希望来自后端的值能够正确匹配,对于那些不是来自后端的字段,我希望它们成为值null或其他一些默认值值。我该如何实现?

这是示例JSON

{  
    'display':{  
        'image':'https://kdfnvdfkdvd',
        'title':'fkfjkfdvfldvmdflv',
        'large_text':'bvfdkvkdfv',
        'icon':'something.jpg',
        'image_format':'SQUARE'
    },
    'data':{  
        'image_pk':9
    },
    'notif_id':8,
    'screen':'IMAGE',
    'priority':0,
    'time':'2016-02-06 15:22:33',
    is_read:False
}
Run Code Online (Sandbox Code Playgroud)

我所指的字段是数据。它包含变量JSON。

android json gson retrofit

5
推荐指数
1
解决办法
675
查看次数