반응형
io.reactivex.Observable에 대한 통화 어댑터를 만들 수 없습니다.
내 서버 (Rails 앱)에 간단한 get 메서드를 보내고 RxJava 및 Retrofit을 사용하여 결과를 가져옵니다. 내가 한 일은 :
내 인터페이스 :
public interface ApiCall {
String SERVICE_ENDPOINT = "https://198.50.214.15";
@GET("/api/post")
io.reactivex.Observable<Post> getPost();
}
내 모델은 다음과 같습니다.
public class Post
{
@SerializedName("id")
private String id;
@SerializedName("body")
private String body;
@SerializedName("title")
private String title;
public String getId ()
{
return id;
}
public String getBody ()
{
return body;
}
public String getTitle ()
{
return title;
}
}
그리고 이것은 내 활동에서 한 일입니다.
public class Javax extends AppCompatActivity {
RecyclerView rvListContainer;
postAdapter postAdapter;
List<String> messageList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_javax);
rvListContainer=(RecyclerView)findViewById(R.id.recyclerView);
postAdapter=new postAdapter(messageList);
rvListContainer.setAdapter(postAdapter);
}
@Override
protected void onResume() {
super.onResume();
Retrofit retrofit=new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://198.50.214.15")
.build();
ApiCall apiService=retrofit.create(ApiCall.class);
Observable<Post> observable=apiService.getPost();
observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(responseData -> {
messageList.add(responseData.getTitle());
postAdapter.notifyDataSetChanged();
});
}
}
어댑터에 문제가 있다는이 오류가 발생하는 이유를 모르겠습니다. 또한 어댑터를 gradle에 포함했습니다.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hussein.sqlitedatabase, PID: 19445
java.lang.RuntimeException: Unable to resume activity {com.example.hussein.sqlitedatabase/com.example.hussein.sqlitedatabase.Javax}: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.Observable<com.example.hussein.sqlitedatabase.Post>
for method ApiCall.getPost
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2964)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2993)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.Observable<com.example.hussein.sqlitedatabase.Post>
for method ApiCall.getPost
at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:751)
at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:236)
at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:161)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:169)
at retrofit2.Retrofit$1.invoke(Retrofit.java:146)
at $Proxy0.getPost(Native Method)
at com.example.hussein.sqlitedatabase.Javax.onResume(Javax.java:42)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1197)
at android.app.Activity.performResume(Activity.java:5343)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2950)
... 12 more
Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for io.reactivex.Observable<com.example.hussein.sqlitedatabase.Post>.
Tried:
* retrofit2.adapter.rxjava.RxJavaCallAdapterFactory
* retrofit2.ExecutorCallAdapterFactory
at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:240)
at retrofit2.Retrofit.callAdapter(Retrofit.java:204)
at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:234)
... 20 more
이것은 내 Gradle 종속성입니다.
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.google.code.gson:gson:2.4'
}
다음을 사용하여 RxJava 2를 사용하고 싶다고 Retrofit에 알려야합니다.
addCallAdapterFactory(RxJava2CallAdapterFactory.create())
따라서 Retrofit
개체 를 만들려면 다음과 같은 것이 있습니다.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SERVICE_ENDPOINT)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
나는 같은 문제에 부딪쳤다. 새 저장소를 추가하는 대신 Jake Wharton 라이브러리의 종속성을 추가 할 수 있습니다.
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
그런 다음 공장을 추가 할 수 있습니다.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
어댑터가 버전 2 ..를 가지고 있다는 사실은 내가 생각한 것처럼 RxJava 2와 함께 사용하도록 의도 된 것은 아닙니다.
implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
문제는 사용중인 라이브러리에 있습니다.
I have replaced
implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0'
with
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
and used
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL).client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
반응형
'Programing' 카테고리의 다른 글
jQuery AJAX 호출에 대한 로딩 표시기 구현 (0) | 2020.09.17 |
---|---|
Swift-두 줄의 텍스트가있는 UIButton (0) | 2020.09.17 |
숫자의 Excel과 유사한 열 이름을 얻는 알고리즘 (0) | 2020.09.17 |
Web API에서 응답을 직렬화하지 못했습니다. (0) | 2020.09.17 |
명부 (0) | 2020.09.16 |