使用rxJava2和rxJava2解析OpenWeatherMap中的数据
我已经开始学习改型和RxJava,并决定创建weatherApp。现在我的目标是从OpenWeatherMapAPI检索天气数据。这是我的密码: 对于api:使用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
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