2016-12-29 101 views
1

我正在使用Retrofit2尝试将图像发送到服务器。我正在使用命令模式来执行此操作。我收到以下错误:Retrofit2:ClassCastException:java.util.ArrayList不能转换为类

com.gary.test.api.commands.AddMediaCommand$1 cannot be cast to java.util.List

所以我有类调用AddMediaCommand

public class AddMediaCommand implements Commander { 
    private final TypedByteArray media; 
    private static final int QUALITY = 100; 
    private final Context context; 

    public AddMediaCommand(Context ctx, Bitmap image) { 
     this.context = ctx; 

     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     image.compress(Bitmap.CompressFormat.JPEG, QUALITY, out); 

     media = new TypedByteArray("image/jpeg", out.toByteArray()){ 
      @Override 
      public String fileName() { 
       return "file.jpg"; 
      } 
     }; 
    } 

    @Override 
    public void execute() { 
     new AddMediaService(context, new CommanderListener() { 
      @Override 
      public void onResultReceived(Bundle extras) { 
       sendBroadcastResult(extras); 
      } 
     }).addMedia(media); 
    } 

    private void sendBroadcastResult(Bundle extras) { 
     Intent intent = new Intent(BroadcastActions.BROADCAST_ADD_MEDIA); 
     intent.putExtras(extras); 
     LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 
    } 
} 

此执行AddMediaService

public class AddMediaService extends BaseService { 

    private final Context context; 
    private final String server; 
    private static final String TAG = "AddMediaService"; 

    public AddMediaService(Context context, CommanderListener listener) { 
     this.context = context; 
     this.server = ApiPreferences.getInstance(context).getDapiDaftServerApi(); 
     setCommanderListener(listener); 
    } 

    public void addMedia(TypedByteArray image) { 
     Call<MediaModel> mdMediaModelCall = getRetrofit2DapiService(context).addMedia(image); 

     mdMediaModelCall.enqueue(new retrofit2.Callback<MediaModel>() { 
      @Override 
      public void onResponse(Call<MediaModel> call, retrofit2.Response<MediaModel> response) { 
       handleSuccess(response.body()); 
       Log.d(TAG, "Success"); 
      } 

      @Override 
      public void onFailure(Call<MDMediaModel> call, Throwable t) { 
       Log.d(TAG, "Failure"); 
      } 
     }); 
    } 

    protected void handleSuccess(MediaModel model) { 
     Bundle bundle = new Bundle(2); 
     bundle.putInt(Extras.RESPONSE_CODE, ResponseCodes.OK); 
     bundle.putParcelable(Extras.PARAM_MEDIA, model); 
     sendResult(bundle); 
    } 
} 

addMedia Retrofit2方法如下

@retrofit2.http.Multipart 
@retrofit2.http.POST("/media") 
Call<MediaModel> addMedia(@retrofit2.http.Part("file") TypedByteArray image); 

我正在从翻新1.9升级到翻新2.这在1.9中没有问题,所以我不确切知道这个问题是什么。我发现this这是类似的东西。然而,OP正在铸造他们的代码,我不是。

如果有人能帮助我,我将不胜感激。我已经升级了许多我的api调用,并没有出现这个问题。任何帮助将不胜感激。

编辑 - MEDIAMODEL CLASS

public class MediaModel implements MediaImage { 

    //Used to mark a error in the media transfer. 
    public static final int NETWORK_ERROR_MEDIA_ID = -100; 

    Integer id; 
    String url; 
    int order; 
    private String message; 
    private Thumbnails thumbnails; 
    private transient WeakReference<Bitmap> temporaryImage; 

    public MediaModel() { 
    } 

    public String getMessage() { 
     return message; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public void setOrder(int order) { 
     this.order = order; 
    } 

    public Thumbnails getThumbnails() { 
     return thumbnails; 
    } 

    public void setTemporaryImage(Bitmap image) { 
     if (image == null) { 
      if (temporaryImage != null) { 
       temporaryImage.clear(); 
      } 
     } else { 
      this.temporaryImage = new WeakReference<>(image); 
     } 
    } 

    public Bitmap getTemporaryImage() { 
     if (temporaryImage == null) { 
      return null; 
     } else { 
      return temporaryImage.get(); 
     } 
    } 
    @Override 
    public void setImageUrl(String url) { 
     setUrl(url); 
    } 

    @Override 
    public String getImageUrl(int imageType) { 
     if (imageType == THUMBNAIL_IMAGE_TYPE){ 
      return getThumbnails().getUrl(); 
     } 
     return getUrl(); 
    } 

    public static class Thumbnails { 
     private String large; 

     public Thumbnails(String largeUrl) { 
      this.large = largeUrl; 
     } 

     public String getUrl() { 
      return large; 
     } 

     public void setUrl(String url) { 
      this.large = url; 
     } 
    } 

    public static final Creator<MediaModel> CREATOR = new Creator<MediaModel>() { 
     public MediaModel createFromParcel(Parcel source) { 
      return new MediaModel(source); 
     } 

     public MediaModel[] newArray(int size) { 
      return new MediaModel[size]; 
     } 
    }; 

    private MediaModel(Parcel in) { 
     id = (Integer) in.readValue(Integer.class.getClassLoader()); 
     url = in.readString(); 
     order = in.readInt(); 
     message = in.readString(); 
     thumbnails = new Thumbnails(in.readString()); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeValue(id); 
     dest.writeString(url); 
     dest.writeInt(order); 
     dest.writeString(message); 
     dest.writeString(thumbnails == null ? EMPTY_STRING : thumbnails.getUrl()); 
    } 
} 
+0

更多信息,你可以分享'MediaModel'类的代码? –

+0

@RahulSonpaliya邮编编辑包括类 –

回答

0

在你AddMediaCommand创建ResquestBody对象作为这样:

File file = new File("file.jpg"); 
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); 

然后在内部AddMediaService您addMedia方法创建MultipartBody对象使用:

MultipartBody.Part.createFormData("file", file.getName(), requestFile)

最后修改改造Web服务接口使用MultipartBody.Part对象:

@retrofit2.http.Multipart 
@retrofit2.http.POST("/media") 
Call<MediaModel> addMedia(@retrofit2.http.Part("file") MultipartBody.Part image); 

您可以在这里找到https://github.com/square/retrofit/issues/1063

相关问题