Retrofit开发过程中遇见的bug(持续更新)

按照下面流程开发时遇到的bug

java.lang.IllegalArgumentException: @PartMap parameters can only be used with multipart encoding. (parameter #9

利用retrofit进行上传图片请求时’

ApiNet中的注解`

@POST("orders-comments")
  Observable<EvaluateEntity> sendEvaluate(@HeaderMap Map<String,String> headers,@Query("productId"),@QueryMap Map<String,String> map,@PartMap() Map<String, RequestBody> file);

封装的方法

public void sendEvaluate(Subscriber<EvaluateEntity> subscriber,Map requestToken,long productId,long Map<String,String> map,Map<String, RequestBody> partParams){
   mApiNet.sendEvaluate(requestToken,productId,shopId,anonymity,description,logistics,attitude,map,partParams)
        .subscribeOn(Schedulers.io())
        .unsubscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(subscriber);
  }

请求数据时得应用

 private void sendPublish() {
    String content;

    Map<String, RequestBody> partParams;

    List<String> list = new ArrayList<String>();
    for (int i = 0; i < Bimp.drr.size(); i++) {
      String Str = Bimp.drr.get(i)
          .substring(Bimp.drr.get(i).lastIndexOf("/") + 1, Bimp.drr.get(i).lastIndexOf("."));
      list.add(FileUtils.SDPATH + Str + ".JPEG");
    }
    if (list.size() > 0) {

      partParams = new HashMap<>();
      for (int i = 0; i < list.size(); i++) {
        BufferedInputStream in = null;
        try {
          in = new BufferedInputStream(new FileInputStream(new File(list.get(i))));
          BitmapFactory.Options options = new BitmapFactory.Options();
          options.inJustDecodeBounds = true;
          BitmapFactory.decodeStream(in, null, options);

          partParams.put("file\";filename=\"" + i + "#" + options.outWidth + "#" + options.outHeight + ".jpeg",
          RequestBody.create(MediaType.parse("multipart/form-data"), new File(list.get(i))));
          System.out.println(i + "#" + options.outWidth + "#" + options.outHeight + ".jpeg");
          in.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    } else {
      Toast.makeText(getContext(), "图片为空", Toast.LENGTH_SHORT).show();
      return;
    }

    Map<String, String> filedParams = new HashMap<>();
    if (etPostDesc.getText().toString().isEmpty()) {

    } else {
      content = etPostDesc.getText().toString().trim();
      filedParams.put("context", content);
    }

    unsubscribe();

    //利用封装后的retrofit来请求
    Subscriber mSubscriber = new Subscriber<EvaluateEntity>() {
      @Override public void onCompleted() {
      }

      @Override public void onError(Throwable e) {
        if (isNetCollect) {
          stateLayout.showEmpty();
        } else {
          stateLayout.showError();
        }
      }

      @Override public void onNext(EvaluateEntity EvaluateEntity) {
        if (EvaluateEntity.getState() == 0) {
          stateLayout.showContent();
          if (rlNetStates != null) {
            rlNetStates.setVisibility(View.GONE);
          }

          Toast.makeText(getContext(), "发布成功", Toast.LENGTH_SHORT).show();
          Bimp.bmp.clear();
          Bimp.drr.clear();
          Bimp.max = 0;
        }
      }
    };
    HttpMethods.getInstance()
        .sendEvaluate(mSubscriber, GetToken.getAccessToken(), productId, filedParams, partParams);
  }

上面bug的解决办法

  • 只需要在ApiNet中添加一个注解
**@Multipart**
  @POST("orders-comments")
  Observable<EvaluateEntity> sendEvaluate(@HeaderMap Map<String,String> headers,@Query("productId") long productId  ,@QueryMap Map<String,String> map,@PartMap() Map<String, RequestBody> file);

问题2
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 81

利用封装好的retrofit进行网络请求,接口和参数都没有问题,但就是请求不到数据,如果在onError中debug异常e.printStackTrace();就会看到此bug

这种bug的意思是你按对象解析的,而实际它是一个数组
其实还是因为retrofit内部json解析时出现了问题
接下来看你封装的retrofit

我先前封装的retrofit

mRetrofit = new Retrofit.Builder()
        .client(httpClientBuilder.build())
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
     .baseUrl(BASE_URL)
        .build();

解决bug

修改GSON为fastjson

mRetrofit = new Retrofit.Builder()
        .client(httpClientBuilder.build())
        //.addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addConverterFactory(FastJsonConverterFactory.create())
        .baseUrl(BASE_URL)
        .build();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值