使用rxJava2和rxJava2解析OpenWeatherMap中的数据

使用rxJava2和rxJava2解析OpenWeatherMap中的数据,java,android,retrofit2,rx-java2,Java,Android,Retrofit2,Rx Java2,我已经开始学习改型和RxJava,并决定创建weatherApp。现在我的目标是从OpenWeatherMapAPI检索天气数据。这是我的密码: 对于api: package com.example.aldres.workingwithapis.Api; import com.example.aldres.workingwithapis.models.WeatherData; import retrofit2.http.GET; import retrofit2.http.Query; im

我已经开始学习改型和RxJava,并决定创建weatherApp。现在我的目标是从OpenWeatherMapAPI检索天气数据。这是我的密码: 对于api:

package com.example.aldres.workingwithapis.Api;

import com.example.aldres.workingwithapis.models.WeatherData;

import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;

public interface Api {
    @GET("weather?")
    Observable<WeatherData> getWeatherData(@Query("q") String city);
}
package com.example.aldres.workingwithapi.Api;
导入com.example.aldres.workingwithAPI.models.WeatherData;
导入文件2.http.GET;
导入2.http.Query;
进口接收。可观察;
公共接口Api{
@得到(“天气?”)
可观测的getWeatherData(@Query(“q”)字符串城市);
}
我的WeatherData模型的另一个代码:

package com.example.aldres.workingwithapis.models;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class WeatherData {

    @SerializedName("coord")
    @Expose
    private Coord coord;
    @SerializedName("weather")
    @Expose
    private List<Weather> weather = null;
    @SerializedName("base")
    @Expose
    private String base;
    @SerializedName("main")
    @Expose
    private Main main;
    @SerializedName("visibility")
    @Expose
    private Integer visibility;
    @SerializedName("wind")
    @Expose
    private Wind wind;
    @SerializedName("clouds")
    @Expose
    private Clouds clouds;
    @SerializedName("dt")
    @Expose
    private Integer dt;
    @SerializedName("sys")
    @Expose
    private Sys sys;
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("cod")
    @Expose
    private Integer cod;

    public Coord getCoord() {
        return coord;
    }

    public void setCoord(Coord coord) {
        this.coord = coord;
    }

    public List<Weather> getWeather() {
        return weather;
    }

    public void setWeather(List<Weather> weather) {
        this.weather = weather;
    }

    public String getBase() {
        return base;
    }

    public void setBase(String base) {
        this.base = base;
    }

    public Main getMain() {
        return main;
    }

    public void setMain(Main main) {
        this.main = main;
    }

    public Integer getVisibility() {
        return visibility;
    }

    public void setVisibility(Integer visibility) {
        this.visibility = visibility;
    }

    public Wind getWind() {
        return wind;
    }

    public void setWind(Wind wind) {
        this.wind = wind;
    }

    public Clouds getClouds() {
        return clouds;
    }

    public void setClouds(Clouds clouds) {
        this.clouds = clouds;
    }

    public Integer getDt() {
        return dt;
    }

    public void setDt(Integer dt) {
        this.dt = dt;
    }

    public Sys getSys() {
        return sys;
    }

    public void setSys(Sys sys) {
        this.sys = sys;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getCod() {
        return cod;
    }

    public void setCod(Integer cod) {
        this.cod = cod;
    }

}
package com.example.aldres.workingwithapi.models;
导入java.util.List;
导入com.google.gson.annotations.Expose;
导入com.google.gson.annotations.SerializedName;
公共类天气数据{
@序列化名称(“协调”)
@暴露
私人合作社;
@序列化名称(“天气”)
@暴露
私有列表天气=空;
@序列化名称(“基”)
@暴露
私有字符串基;
@序列化名称(“主”)
@暴露
私人主楼;
@序列化名称(“可见性”)
@暴露
私有整数可见性;
@序列化名称(“风”)
@暴露
私人风;
@序列化名称(“云”)
@暴露
私密的云朵;
@序列化名称(“dt”)
@暴露
私有整数dt;
@序列化名称(“sys”)
@暴露
私有系统;
@序列化名称(“id”)
@暴露
私有整数id;
@序列化名称(“名称”)
@暴露
私有字符串名称;
@序列化名称(“cod”)
@暴露
私有整数cod;
公共合作社{
返回坐标;
}
公共无效设置坐标(坐标坐标坐标){
this.coord=coord;
}
公共列表getWeather(){
回归天气;
}
公众天气(列出天气){
这个天气=天气;
}
公共字符串getBase(){
返回基地;
}
公共无效收进框(字符串基){
this.base=base;
}
公共Main getMain(){
回水总管;
}
公共无效设置主(主){
this.main=main;
}
公共整数getVisibility(){
返回能见度;
}
公共void集合可见性(整数可见性){
这个.可见性=可见性;
}
公共风{
回风;
}
公共空间风(风){
风=风;
}
公共云getClouds(){
回归云;
}
公共云(云){
云=云;
}
公共整数getDt(){
返回dt;
}
公共void setDt(整数dt){
这1.dt=dt;
}
公共系统getSys(){
返回系统;
}
公共无效设置系统(Sys Sys){
this.sys=sys;
}
公共整数getId(){
返回id;
}
公共无效集合id(整数id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getCod(){
返回cod;
}
公共void setCod(整数cod){
this.cod=cod;
}
}
也是我的主要活动:

package com.example.aldres.workingwithapis;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.example.aldres.workingwithapis.Api.Api;
import com.example.aldres.workingwithapis.models.WeatherData;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class MainActivity extends AppCompatActivity {
    private TextView middleText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        middleText = findViewById(R.id.middleText);

        Retrofit retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("http://api.openweathermap.org/data/2.5/")
                .build();
        Api apiService = retrofit.create(Api.class);

        Observable<WeatherData> observable = apiService.getWeatherData("London");

                observable
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<WeatherData>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(WeatherData weatherData) {
                        middleText.setText(weatherData.getWind());
                    }
                });
    }
}
package com.example.aldres.workingwithAPI;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.widget.TextView;
导入com.example.aldres.workingwithapi.Api.Api;
导入com.example.aldres.workingwithAPI.models.WeatherData;
进口改装2.改装;
导入2.adapter.rxjava.RxJavaCallAdapterFactory;
进口改装2.converter.gson.GsonConverterFactory;
进口接收。可观察;
输入接收用户;
导入rx.android.schedulers.AndroidSchedulers;
导入rx.schedulers.schedulers;
公共类MainActivity扩展了AppCompatActivity{
私有文本查看中间文本;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
middleText=findViewById(R.id.middleText);
改装改装=新改装.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(“http://api.openweathermap.org/data/2.5/")
.build();
Api apiService=reformation.create(Api.class);
Observable-Observable=apiService.getWeatherData(“伦敦”);
可观察
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(WeatherData WeatherData){
setText(weatherData.getWind());
}
});
}
}

此时,我的应用程序应该将带有wind参数的字符串显示到我的TextView middleText中,但当我启动应用程序时,它启动时没有任何错误,但我的文本不在TextView中。我做错了什么

您的请求可能在您不知道的情况下出错,因为您忽略了onError方法。
e.printStackTrace()
添加到该方法中,查看是否存在这种情况。

您的请求可能在您不知道的情况下出错,因为您忽略了onError方法。
e.printStackTrace()
添加到该方法中,以查看是否存在这种情况。

介意包括错误吗?我的日志中没有错误,这是一个问题。您应该使用
.subscribeOn(Schedulers.io())
。你的api需要密钥吗??Api调用应该是:{my city name}。我已将
.subscribeOn(Schedulers.newThread())
更改为
.subscribeOn(Schedulers.io())
,但仍然是一样的。您是否更改了
m