2016-12-29 5 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); 

Я нахожусь в процессе модернизации от Retrofit 1.9 до Retrofit 2. Это работало без проблем в версии 1.9, поэтому я точно не знаю, что это за проблема. Я нашел this что-то подобное. Однако этот OP забрасывает в свой код, а я нет.

Если кто-нибудь может мне помочь, я бы очень признателен. Я обновил многие мои вызовы api, и этой проблемы не было. Любая помощь будет принята с благодарностью.

EDIT - MEDIAMODEL КЛАСС

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); 

затем в методе addMedia внутри AddMediaService создать объект MultipartBody с помощью:

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

Наконец изменить интерфейс дооснащения WebService использовать объект 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