[英]Android can not resolve subscribe method in rxjava
我打算在Android Studio中使用rxjava進行改造。 實際上,我遵循了這個https://code.tutsplus.com/tutorials/getting-started-with-retrofit-2--cms-27792教程這就是我所做的一切:
compile 'com.android.support:appcompat-v7:25.1.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.android.support:recyclerview-v7:25.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.9'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
我創建了Retrofit客戶端和Interface訂閱方法。 說不能解決
mService.getAnswer().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<SOAnswersResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(SOAnswersResponse soAnswersResponse) {
}
}
);
我在主要活動中導入了此內容:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import com.example.android.stackoverflow.Data.Model.Item;
import com.example.android.stackoverflow.Data.Model.SOAnswersResponse;
import com.example.android.stackoverflow.Data.remote.ApiUtils;
import com.example.android.stackoverflow.Data.remote.SOService;
import java.util.ArrayList;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.android.schedulers.AndroidSchedulers;
import rx.Subscriber;
Rxplanation :
在本教程中,您已鏈接過使用RxJava1。在RxJava 2方法中, subscribe
不接受Subscriber
類實例作為參數。 您必須使用:
單身 : 消費者 , BiConsumer , SingleObserver ,
對於Maybe : 消費者 , 行動 , MaybeObserver ,
對於Flowable : 使用者 , 動作 , FlowableSubscriber ,
for Completable : 消費者 , Action , CompletableObserver ,
上面提到的所有運算符也都具有無參數的subscribe()
方法。
清理工作
您的依賴項中有些混亂。 我能想到的最簡短的依賴項列表是:
// Reactive extensions.
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
// Networking.
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-jackson:2.2.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
特別是,請不要使用兩個不同版本的RxAndroid
或適配器:
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
也已不再使用Jake Wharton的適配器。 Square已為RxJava2准備了適配器:
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
樣例代碼
現在,配置完所有內容后,域模型可以如下所示:
package com.todev.rxretrofit;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(value = NON_NULL)
class Song {
private String id;
private String title;
public String getId() {
return id;
}
public String getTitle() {
return title;
}
}
請記住,我使用了Jackson(因為使用IMHO更簡單)。 不要猶豫,使用GSON批注,但是您將不得不將Jackson依賴項更改為GSON並重新配置Retrofit服務實例構造。
簡單的服務界面:
package com.todev.rxretrofit;
import io.reactivex.Single;
import java.util.Collection;
import retrofit2.http.GET;
interface CustomService {
@GET("songs")
Single<Collection<Song>> getAllSongs();
}
最后(但並非最不重要)在活動中的用法(我故意包括了所有進口):
package com.todev.rxretrofit;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import java.util.Collection;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
public class MainActivity extends AppCompatActivity {
private CustomService customService = new Retrofit.Builder()
.baseUrl("http://<api_address>:<api_port>/")
.addConverterFactory(JacksonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(new OkHttpClient.Builder().build())
.build()
.create(CustomService.class);
private CompositeDisposable disposables = new CompositeDisposable();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.disposables.add(
this.customService.getAllSongs()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this.responseHandler, this.errorHandler));
}
@Override
protected void onDestroy() {
this.disposables.dispose();
super.onDestroy();
}
private Consumer<Collection<Song>> responseHandler = new Consumer<Collection<Song>>() {
@Override
public void accept(Collection<Song> songs) throws Exception {
// TODO: Handle response.
for (Song song : songs) {
Log.d(this.getClass().getSimpleName(), String.valueOf(song));
}
}
};
private Consumer<Throwable> errorHandler = new Consumer<Throwable>() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
// TODO: Handle error.
Log.d(this.getClass().getSimpleName(), throwable.getLocalizedMessage());
}
};
}
如您所見,我使用了Consumer
。 您也可以使用lambda表達式,而使用類方法。
注意
此示例中使用的JSON文檔由json-server通過簡單文本文件提供:
[
{
"id": 0,
"title": "Song of Fire and Ice"
},
{
"id": 1,
"title": "The Hanging Tree"
}
]
投稿
請記住在清單中添加Internet權限:
<uses-permission android:name="android.permission.INTERNET"/>
否則,您將收到SocketException
原因:
android.system.ErrnoException:套接字失敗:EACCES(權限被拒絕)
您應該添加以下3個庫
implementation 'com.squareup.retrofit2:retrofit:2.6.1'
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.