[解決済み] Android Retrofit ライブラリで自分のクラスのコンバータを作成できない
2022-04-26 18:27:51
質問
VolleyからRetrofitに移行中ですが、JSONObjectのレスポンスをgsonアノテーションを実装したオブジェクトに変換するために以前使用したgsonクラスがすでにあります。Retrofitを使ってhttp getリクエストを作ろうとしたところ、このエラーでアプリがクラッシュしてしまいました。
Unable to start activity ComponentInfo{com.lightbulb.pawesome/com.example.sample.retrofit.SampleActivity}: java.lang.IllegalArgumentException: Unable to create converter for class com.lightbulb.pawesome.model.Pet
for method GitHubService.getResponse
のガイドに従います。 後付け サイトと私は、これらの実装を思い付く。
これは私のアクティビティで、retro httpリクエストを実行しようとしているところです。
public class SampleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("**sample base url here**")
.build();
GitHubService service = retrofit.create(GitHubService.class);
Call<Pet> callPet = service.getResponse("41", "40");
callPet.enqueue(new Callback<Pet>() {
@Override
public void onResponse(Response<Pet> response) {
Log.i("Response", response.toString());
}
@Override
public void onFailure(Throwable t) {
Log.i("Failure", t.toString());
}
});
try{
callPet.execute();
} catch (IOException e){
e.printStackTrace();
}
}
}
私のAPIとなったインターフェース
public interface GitHubService {
@GET("/ **sample here** /{petId}/{otherPet}")
Call<Pet> getResponse(@Path("petId") String userId, @Path("otherPet") String otherPet);
}
そして最後に、レスポンスとなるべきPetクラスです。
public class Pet implements Parcelable {
public static final String ACTIVE = "1";
public static final String NOT_ACTIVE = "0";
@SerializedName("is_active")
@Expose
private String isActive;
@SerializedName("pet_id")
@Expose
private String petId;
@Expose
private String name;
@Expose
private String gender;
@Expose
private String age;
@Expose
private String breed;
@SerializedName("profile_picture")
@Expose
private String profilePicture;
@SerializedName("confirmation_status")
@Expose
private String confirmationStatus;
/**
*
* @return
* The confirmationStatus
*/
public String getConfirmationStatus() {
return confirmationStatus;
}
/**
*
* @param confirmationStatus
* The confirmation_status
*/
public void setConfirmationStatus(String confirmationStatus) {
this.confirmationStatus = confirmationStatus;
}
/**
*
* @return
* The isActive
*/
public String getIsActive() {
return isActive;
}
/**
*
* @param isActive
* The is_active
*/
public void setIsActive(String isActive) {
this.isActive = isActive;
}
/**
*
* @return
* The petId
*/
public String getPetId() {
return petId;
}
/**
*
* @param petId
* The pet_id
*/
public void setPetId(String petId) {
this.petId = petId;
}
/**
*
* @return
* The name
*/
public String getName() {
return name;
}
/**
*
* @param name
* The name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* @return
* The gender
*/
public String getGender() {
return gender;
}
/**
*
* @param gender
* The gender
*/
public void setGender(String gender) {
this.gender = gender;
}
/**
*
* @return
* The age
*/
public String getAge() {
return age;
}
/**
*
* @param age
* The age
*/
public void setAge(String age) {
this.age = age;
}
/**
*
* @return
* The breed
*/
public String getBreed() {
return breed;
}
/**
*
* @param breed
* The breed
*/
public void setBreed(String breed) {
this.breed = breed;
}
/**
*
* @return
* The profilePicture
*/
public String getProfilePicture() {
return profilePicture;
}
/**
*
* @param profilePicture
* The profile_picture
*/
public void setProfilePicture(String profilePicture) {
this.profilePicture = profilePicture;
}
protected Pet(Parcel in) {
isActive = in.readString();
petId = in.readString();
name = in.readString();
gender = in.readString();
age = in.readString();
breed = in.readString();
profilePicture = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(isActive);
dest.writeString(petId);
dest.writeString(name);
dest.writeString(gender);
dest.writeString(age);
dest.writeString(breed);
dest.writeString(profilePicture);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Pet> CREATOR = new Parcelable.Creator<Pet>() {
@Override
public Pet createFromParcel(Parcel in) {
return new Pet(in);
}
@Override
public Pet[] newArray(int size) {
return new Pet[size];
}
};
}
解決方法は?
以前
2.0.0
では、デフォルトのコンバータはgsonコンバータでしたが
2.0.0
となり、それ以降のデフォルトのコンバータは
ResponseBody
. docsから。
デフォルトでは、RetrofitはHTTPボディをデシリアライズして、OkHttpの
ResponseBody
タイプで、そのRequestBody
に対する型@Body
.
で
2.0.0+
を使用する場合は、Gsonコンバータを使用することを明示的に指定する必要があります。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("**sample base url here**")
.addConverterFactory(GsonConverterFactory.create())
.build();
また、gradle ファイルに以下の依存関係を追加する必要があります。
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
コンバーターには、後付けと同じバージョンを使用します。 上記はこのretrofitの依存関係と一致します。
compile ('com.squareup.retrofit2:retrofit:2.1.0')
また、これを書いている時点では、retrofitのドキュメントが完全に更新されていないため、この例では問題が発生したことに注意してください。ドキュメントより。
注意:このサイトはまだ新しい2.0のAPI用に拡張されている最中です。
関連
-
cygwinのダウンロード、インストールチュートリアル、およびCDTの「makeプログラムがパスに見つからない」バグの解消
-
アンドロイドスタジオのエラーを解決する --> Error:(1, 0) id 'com.android.application' を持つプラグインが見つかりません。
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
エラー:未宣言の識別子(AS)の使用
-
GoogleMapと連携し、位置情報の取得が可能
-
Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する
-
[解決済み] Android Studioにライブラリプロジェクトを追加する方法を教えてください。
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】Android Studioです。jarをライブラリとして追加しますか?
-
[解決済み】Androidで透明なActivityを作成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
aapt2エラー:ログを確認する(具体的な原因の探り方)
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
Android Studio を 3.6.3 にアップデートした後、構成 :classpath のアーティファクトをすべて解決できない。
-
GIF、Lottie、SVGA
-
Android studioのインストールと問題発生、Emulator: PANIC: AVDのシステムパスが見つかりません。
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
アンドロイドスタジオのエラーを解決する --> Error:(1, 0) id 'com.android.application' を持つプラグインが見つかりません。
-
エラー:未宣言の識別子(AS)の使用
-
アンドロイドリストビュー
-
アプリの実行エラー。ターゲットデバイスが見つからない問題