gpt4 book ai didi

Android 无法解析 rxjava 中的订阅方法

转载 作者:行者123 更新时间:2023-11-29 14:44:42 25 4
gpt4 key购买 nike

我想在 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) {

}


}
);

我在我的主要 Activity 中导入了这个:

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:

在您链接的教程中使用了 RxJava 1。在 RxJava 2 中,方法 subscribe 不接受 Subscriber 类实例作为参数。你必须使用:

所有上面提到的运算符也有不带参数的 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(因为使用恕我直言更简单)。不要犹豫,使用 GSON 注释,但要注意,您必须将 Jackson 依赖项更改为 GSON 并重新配置 Retrofit 服务实例构造。

简单的服务接口(interface):

package com.todev.rxretrofit;

import io.reactivex.Single;
import java.util.Collection;
import retrofit2.http.GET;

interface CustomService {

@GET("songs")
Single<Collection<Song>> getAllSongs();
}

最后(但并非最不重要)在 Activity 中的使用(我故意包括所有进口):

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 表达式并改用类方法。

enter image description here

注意事项

此示例中使用的 JSON 文档由 json-server 提供来自简单的文本文件:

[
{
"id": 0,
"title": "Song of Fire and Ice"
},
{
"id": 1,
"title": "The Hanging Tree"
}
]

后记

请记住在您的 list 中添加互联网权限:

<uses-permission android:name="android.permission.INTERNET"/>

否则您将收到 SocketException 原因:

android.system.ErrnoException: socket failed: EACCES (Permission denied)

关于Android 无法解析 rxjava 中的订阅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43763173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com