[英]android - using retrofit to get data, but not parse into object
我是Retrofit的新手。 我正在嘗試使用Retrofit查詢OpenWeatherMap並返回一些天氣數據。
這是我的一些代碼:
public static void getCurForecast(final Resources resources, final String zipCode, final String countryCode, final ForecastListener listener) {
new AsyncTask<Void, Void, CurForecastResponse>() {
@Override
protected CurForecastResponse doInBackground(Void... params) {
Log.d("TAG","in CurForecastResponse");
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://api.openweathermap.org")
.build();
//String zipCode = "78613";
//String countryCode = "us";
ForecastRequest service = restAdapter.create(ForecastRequest.class);
try {
String zipCodeFormat = zipCode + ",us";
Log.d("TAG","zipCodeFormat: " + zipCodeFormat);
CurForecastResponse temp = service.getCurForecast(zipCodeFormat, resources.getString(R.string.open_weather_api_key));
if(temp == null){
Log.d("TAG","TEMP = NULL!");
}
else {
Log.d("TAG","Weather: " + temp.name);
}
return temp;//service.getCurForecast(zipCodeFormat, resources.getString(R.string.open_weather_api_key));
} catch (RetrofitError error) {
Log.w("ForecastModule", "Forecast error: " + error.getMessage());
return null;
}
};
這是JSON對象的一部分:
public class CurForecastResponse {
public int cod;
public String base;
public String name;
public ForecastCurrently currently;
public ForecastHourly hourly;
public Weather main;
public CurForecastResponse() {
Log.d("TAG","CurForecastResponse Constructor");
}
public class weather {
int id;
String main;
String description;
String icon;
public weather(int id, String main, String description, String icon) {
this.id = id;
this.main = main;
this.description = description;
this.icon = icon;
}
public int getId() {return id; }
public String getDescription() {return description; }
public String getIcon() {return icon; }
public String getMain() {return main; }
}
這是ForecastRequest類
public interface ForecastRequest {
//Open Weather Forecast API
@GET("/data/2.5/weather?")
CurForecastResponse getCurForecast(@Query("zip") String zipCode,
@Query("apiKey") String apiKey);
}
這是JSON響應的示例
{"coord":{"lon":145.77,"lat":-16.92},
"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],
"base":"cmc stations",
"main":{"temp":305.15,"pressure":1013,"humidity":52,"temp_min":305.15,"temp_max":305.15},"wind":{"speed":5.7,"deg":40},"clouds":{"all":20},"dt":1459137600,"sys":{"type":1,"id":8166,"message":0.0092,"country":"AU","sunrise":1459110134,"sunset":1459153277},"id":2172797,"name":"Cairns","cod":200}
我無法將數據輸入天氣課。
在Retrofit2中,應使用call包裝返回值。
調用實例可以同步或異步執行。 每個實例只能使用一次,但是調用clone()將創建一個可以使用的新實例。
因此,從github存儲庫中獲取的快速示例是:
public final class SimpleService {
public static final String API_URL = "https://api.github.com";
public static class Contributor {
public final String login;
public final int contributions;
public Contributor(String login, int contributions) {
this.login = login;
this.contributions = contributions;
}
}
public interface GitHub {
@GET("/repos/{owner}/{repo}/contributors")
Call<List<Contributor>> contributors(
@Path("owner") String owner,
@Path("repo") String repo);
}
public static void main(String... args) throws IOException {
// Create a very simple REST adapter which points the GitHub API.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
// Create an instance of our GitHub API interface.
GitHub github = retrofit.create(GitHub.class);
// Create a call instance for looking up Retrofit contributors.
Call<List<Contributor>> call = github.contributors("square", "retrofit");
// Fetch and print a list of the contributors to the library.
List<Contributor> contributors = call.execute().body();
for (Contributor contributor : contributors) {
System.out.println(contributor.login + " (" + contributor.contributions + ")");
}
}
}
請注意以下行:
List<Contributor> contributors = call.execute().body();
synchronously
運行。 對於asynchronous
調用,請使用call.enqueue
並覆蓋回調方法。
根據json響應
{
"coord": {
"lon": 145.77,
"lat": -16.92
},
"weather": [{
"id": 801,
"main": "Clouds",
"description": "few clouds",
"icon": "02d"
}],
"base": "cmc stations",
"main": {
"temp": 305.15,
"pressure": 1013,
"humidity": 52,
"temp_min": 305.15,
"temp_max": 305.15
},
"wind": {
"speed": 5.7,
"deg": 40
},
"clouds": {
"all": 20
},
"dt": 1459137600,
"sys": {
"type": 1,
"id": 8166,
"message": 0.0092,
"country": "AU",
"sunrise": 1459110134,
"sunset": 1459153277
},
"id": 2172797,
"name": "Cairns",
"cod": 200
}
您的pojo類(模型類)應該像這樣
public class CurForecastResponse {
public Coord coord;
public List<Weather> weather;
public String base;
public Main main;
public Wind wind;
public Clouds clouds;
public double dt;
public Sys sys;
public int id;
public String name;
public int cod;
public CurForecastResponse() {
Log.d("TAG", "CurForecastResponse Constructor");
}
public class Coord {
public double lon;
public double lat;
}
public class Weather {
public int id;
public String main;
public String description;
public String icon;
}
public class Main {
public double temp;
public double pressure;
public double humidity;
public double temp_min;
public double temp_max;
}
public class Wind{
public double speed;
public double deg;
}
public class Clouds{
public double all;
}
public class Sys{
public int type;
public int id;
public double message;
public String country;
public int sunrise;
public int sunset;
}
}
你可以在里面使用setter和getter
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.