Я использую 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());
}
}
вы можете поделиться код класса 'MediaModel'? –
@RahulSonpaliya Сообщение отредактировано, чтобы включить класс –