从 OpenWeatherMap 解析数据,使用 retrofit2 和 rxJava2 [英] Parse data from OpenWeatherMap, using retrofit2 and rxJava2
问题描述
我已经开始学习 Retrofit 和 RxJava,并且我决定创建 weatherApp.现在我的目标是从 OpenWeatherMap Api 检索天气数据.这是我的代码:对于 API:
I've started to learn Retrofit and RxJava, and I've decided to create weatherApp. Now my goal is to retrieve weather data from OpenWeatherMap Api. Here's my code: For 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);
}
还有我的 WeatherData 模型的代码:
Also code for my WeatherData model:
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;
}
}
还有我的 mainActivity:
And also my mainActivity:
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());
}
});
}
}
此时,我的应用程序应该将带有风参数的字符串显示到我的 TextView middleText 中,但是当我启动我的应用程序时,它启动时没有任何错误,但我在 TextView 中没有我的文本.我做错了什么?
At this point, my app should display string with wind parameter into my TextView middleText, but when I start my app, it starts without any errors, but I don't have my text in the TextView. What have I done wrong?
推荐答案
您的请求可能在您不知情的情况下出错,因为您忽略了 onError 方法.将 e.printStackTrace()
添加到该方法中以查看是否是这种情况.
Your request is probably erroring out without you knowing about it as you ignore the onError method.
Add e.printStackTrace()
to that method to see if this is the case.
这篇关于从 OpenWeatherMap 解析数据,使用 retrofit2 和 rxJava2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!