2017-04-16 99 views
26

我將發送一個簡單的get方法到我的服務器(它是Rails應用程序)並使用RxJava和Retrofit獲取結果。我做的事情是:無法爲io.reactivex.Observable創建調用適配器

我的界面:

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 

這是我的搖籃依賴性:

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' 

} 

回答

62

你需要告訴您要使用RxJava 2改造,使用:

addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 

因此,對於創建Retrofit對象,您將擁有類似的東西:

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(SERVICE_ENDPOINT) 
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
    .build(); 
+0

感謝,但另一個問題,我得到的是關於我的網址,它說--->無法連接到/198.50.214.15:80 – Sandro

+0

我改變了這個.baseUrl(「http://198.50.214.15/ 「)但我仍然得到相同的錯誤 – Sandro

+0

我還在url的開頭添加了http:// – Sandro

16

我遇到了同樣的問題。而不是增加新的存儲庫,您可以添加依賴於傑克沃頓商學院的圖書館:

compile '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,就像我想的那樣。

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 
+0

這是很好的答案 –

+0

@ShaktisinhJadeja謝謝你,感覺很好,我對你的幫助 –

+0

你需要使用com.squareup.retrofit2:adapter-rxjava2。請注意,你錯過了2 :) – dleal

相關問題