簡體   English   中英

android-使用改造獲取數據,但不解析為對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM