片段中的Asynctask无法进入onPostExecute

时间:2018-08-19 12:16:54

标签: android android-asynctask android-service httpurlconnection gson

我正在使用openweathermap api(5天预报),并且正在使用GSON解析数据。 asynctask与服务器连接,但不会连接到onPostExecute。一旦获得响应200代码,它将终止。我认为它设置正确,但尚未完成程序:

   private static class GetWeatherAync extends AsyncTask<Context, Void, List<ForecastWeatherList>> {
    private String TAG = GetWeatherAync.class.getSimpleName();
    private final String serviceUrl;
    private Context mContext;
    private Listener listener;
    HttpURLConnection urlConnection = null;


    public GetWeatherAync(Listener listener, Object mStatusView, Object api_key) {
        this.listener = listener;
        this.serviceUrl = "http://api.openweathermap.org/data/2.5/forecast?q=" + "Baltimore" + api_key;
    }

    @Override
    protected List<ForecastWeatherList> doInBackground(Context...params) {
        try {
            Log.d("debugMode", "The application is in doInBackground");

            URL url = new URL(serviceUrl);
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setReadTimeout(10000 /* milliseconds */);
                urlConnection.setConnectTimeout(15000 /* milliseconds */);
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();
                // If the request was successful (response code 200),
                // then read the input stream and parse the response.
                if (urlConnection.getResponseCode() == 200) {
                    Log.e(TAG,"Response code:" + urlConnection.getResponseCode());
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                    ForecastWeatherListWrapper weatherWrapper = new Gson().fromJson(bufferedReader, ForecastWeatherListWrapper.class);
                    return weatherWrapper.getforecastWeatherLists();
                } else {
                    Log.e(TAG, "Error response code: " + urlConnection.getResponseCode());
                }

        } catch (Exception e) {

        }


        return null;


    }



    @Override
    protected void onPostExecute(List<ForecastWeatherList> result) {
        super.onPostExecute(result);
        if (result != null) {
            Log.e(TAG, "populate UI recycler view with gson converted data");
            listener.afterSearch(result);
        }
    }
}

这是我的日志: E / GetWeatherAync:响应代码:200

这是我的天气预报天气列表包装器:

 public class ForecastWeatherListWrapper {

 @SerializedName("list")
 @Expose
 private List<ForecastWeatherList> forecastWeatherLists;

 public List<ForecastWeatherList> getforecastWeatherLists() {
    return forecastWeatherLists;
}

public void setforecastWeatherLists(List<ForecastWeatherList>      
forecastWeatherItems){

   this.forecastWeatherLists = forecastWeatherItems;
       }
}



public class ForecastWeatherList {
@SerializedName("dt")
@Expose
private Integer dt;
@SerializedName("main")
@Expose
private Main main;
@SerializedName("weather")
@Expose
private Weather weather = null;
@SerializedName("clouds")
@Expose
private Clouds clouds;
@SerializedName("wind")
@Expose
private Wind wind;
@SerializedName("rain")
@Expose
private Rain rain;
@SerializedName("sys")
@Expose
private Sys sys;
@SerializedName("dt_txt")
@Expose
private String dtTxt;

public Integer getDt() {
    return dt;
}

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

public Main getMain() {
    return main;
}

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

public Weather getWeather() {
    return (Weather) weather;
}

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

public Clouds getClouds() {
    return clouds;
}

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

public Wind getWind() {
    return wind;
}

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

public Rain getRain() {
    return rain;
}

public void setRain(Rain rain) {
    this.rain = rain;
}

public Sys getSys() {
    return sys;
}

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

public String getDtTxt() {
    return dtTxt;
}

public void setDtTxt(String dtTxt) {
    this.dtTxt = dtTxt;
}



  }

这是我的一些GSON类,用于解析JSON数据。一些类是Main,Clouds等

这是我的主要课程:

public class Main {

@SerializedName("temp")
@Expose
private Double temp;
@SerializedName("temp_min")
@Expose
private Double tempMin;
@SerializedName("temp_max")
@Expose
private Double tempMax;
@SerializedName("pressure")
@Expose
private Double pressure;
@SerializedName("sea_level")
@Expose
private Double seaLevel;
@SerializedName("grnd_level")
@Expose
private Double grndLevel;
@SerializedName("humidity")
@Expose
private Integer humidity;
@SerializedName("temp_kf")
@Expose
private Integer tempKf;

public Double getTemp() {
    return temp;
}

    public void setTemp(Double temp) {
        this.temp = temp;
    }

    public Double getTempMin() {
        return tempMin;
    }

    public void setTempMin(Double tempMin) {
        this.tempMin = tempMin;
    }

    public Double getTempMax() {
        return tempMax;
    }

    public void setTempMax(Double tempMax) {
        this.tempMax = tempMax;
    }

public Double getPressure() {
    return pressure;
}

public void setPressure(Double pressure) {
    this.pressure = pressure;
}

public Double getSeaLevel() {
    return seaLevel;
}

public void setSeaLevel(Double seaLevel) {
    this.seaLevel = seaLevel;
}

public Double getGrndLevel() {
    return grndLevel;
}

public void setGrndLevel(Double grndLevel) {
    this.grndLevel = grndLevel;
}

public Integer getHumidity() {
    return humidity;
}

public void setHumidity(Integer humidity) {
    this.humidity = humidity;
}

public Integer getTempKf() {
    return tempKf;
}

public void setTempKf(Integer tempKf) {
    this.tempKf = tempKf;
}

  }

这是我的天气课:

public class Weather {

@SerializedName("id")
@Expose
private Integer id;
@SerializedName("main")
@Expose
private String main;
@SerializedName("description")
@Expose
private String description;
@SerializedName("icon")
@Expose
private String icon;

public Integer getId() {
    return id;
}

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

public String getMain() {
    return main;
}

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

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getIcon() {
    return icon;
}

public void setIcon(String icon) {
    this.icon = icon;
}


  }

这是我的原始字符串数据(我认为)。

 "cod":"200",
"message":0.0074,
  "cnt":39,
"list":[
  {
     "dt":1534215600,
     "main":{
        "temp":293.24,
        "temp_min":292.346,
        "temp_max":293.24,
        "pressure":1021.77,
        "sea_level":1028.21,
        "grnd_level":1021.77,
        "humidity":100,
        "temp_kf":0.89
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10n"
        }
     ],
     "clouds":{
        "all":20
     },
     "wind":{
        "speed":2.51,
        "deg":275.001
     },
     "rain":{
        "3h":0.0050000000000008
     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-14 03:00:00"
  },
  {
     "dt":1534226400,
     "main":{
        "temp":292.3,
        "temp_min":291.706,
        "temp_max":292.3,
        "pressure":1020.99,
        "sea_level":1027.42,
        "grnd_level":1020.99,
        "humidity":100,
        "temp_kf":0.6
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":2.52,
        "deg":294.505
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-14 06:00:00"
  },
  {
     "dt":1534237200,
     "main":{
        "temp":291.07,
        "temp_min":290.77,
        "temp_max":291.07,
        "pressure":1020.65,
        "sea_level":1027.03,
        "grnd_level":1020.65,
        "humidity":100,
        "temp_kf":0.3
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":1.31,
        "deg":225.5
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-14 09:00:00"
  },
  {
     "dt":1534248000,
     "main":{
        "temp":293.286,
        "temp_min":293.286,
        "temp_max":293.286,
        "pressure":1020.78,
        "sea_level":1027.17,
        "grnd_level":1020.78,
        "humidity":100,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"02d"
        }
     ],
     "clouds":{
        "all":8
     },
     "wind":{
        "speed":2.83,
        "deg":234.501
     },
     "rain":{

     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 12:00:00"
  },
  {
     "dt":1534258800,
     "main":{
        "temp":298.671,
        "temp_min":298.671,
        "temp_max":298.671,
        "pressure":1020.76,
        "sea_level":1027.15,
        "grnd_level":1020.76,
        "humidity":92,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01d"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":2.71,
        "deg":259.5
     },
     "rain":{

     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 15:00:00"
  },
  {
     "dt":1534269600,
     "main":{
        "temp":300.7,
        "temp_min":300.7,
        "temp_max":300.7,
        "pressure":1019.76,
        "sea_level":1026.18,
        "grnd_level":1019.76,
        "humidity":83,
        "temp_kf":0
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10d"
        }
     ],
     "clouds":{
        "all":24
     },
     "wind":{
        "speed":3.66,
        "deg":285.503
     },
     "rain":{
        "3h":1.11
     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 18:00:00"
  },
  {
     "dt":1534280400,
     "main":{
        "temp":298.464,
        "temp_min":298.464,
        "temp_max":298.464,
        "pressure":1019.68,
        "sea_level":1025.97,
        "grnd_level":1019.68,
        "humidity":83,
        "temp_kf":0
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10d"
        }
     ],
     "clouds":{
        "all":48
     },
     "wind":{
        "speed":3.27,
        "deg":289.504
     },
     "rain":{
        "3h":1.61
     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 21:00:00"
  },
  {
     "dt":1534291200,
     "main":{
        "temp":297.882,
        "temp_min":297.882,
        "temp_max":297.882,
        "pressure":1020,
        "sea_level":1026.37,
        "grnd_level":1020,
        "humidity":82,
        "temp_kf":0
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10n"
        }
     ],
     "clouds":{
        "all":36
     },
     "wind":{
        "speed":2.37,
        "deg":275.004
     },
     "rain":{
        "3h":0.13
     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 00:00:00"
  },
  {
     "dt":1534302000,
     "main":{
        "temp":295.242,
        "temp_min":295.242,
        "temp_max":295.242,
        "pressure":1021.11,
        "sea_level":1027.53,
        "grnd_level":1021.11,
        "humidity":94,
        "temp_kf":0
     },
     "weather":[
        {
           "id":802,
           "main":"Clouds",
           "description":"scattered clouds",
           "icon":"03n"
        }
     ],
     "clouds":{
        "all":32
     },
     "wind":{
        "speed":1.26,
        "deg":313.002
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 03:00:00"
  },
  {
     "dt":1534312800,
     "main":{
        "temp":294.05,
        "temp_min":294.05,
        "temp_max":294.05,
        "pressure":1021.27,
        "sea_level":1027.77,
        "grnd_level":1021.27,
        "humidity":100,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":2.46,
        "deg":274.504
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 06:00:00"
  },
  {
     "dt":1534323600,
     "main":{
        "temp":293.495,
        "temp_min":293.495,
        "temp_max":293.495,
        "pressure":1021.36,
        "sea_level":1027.7,
        "grnd_level":1021.36,
        "humidity":100,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":3.01,
        "deg":277.505
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 09:00:00"
],
"city":{
  "id":4347778,
  "name":"Baltimore",
  "coord":{
     "lat":39.2909,
     "lon":-76.6108
  },
  "country":"US",
  "population":620961
 }
  }

3 个答案:

答案 0 :(得分:0)

也许在您打印日志之后,当您尝试转换JSON对象并尝试在返回值之前打印日志时会发生异常

Log.e("something",weatherWrapper.getforecastWeatherLists().size()+"")
   return weatherWrapper.getforecastWeatherLists();

您很可能具有JSON强制转换异常

尝试也登录捕获以查看发生了什么情况

catch (Exception e) {
    Log.e("catch","error")

        }

答案 1 :(得分:0)

我认为问题在于您的网址。您需要传递这样的参数,您忘了传递appid吗? -

  

https://samples.openweathermap.org/data/2.5/forecast?q=London,us&mode=xml&appid=b6907d289e10d714a6e88b30761fae22

您确定从URL得到正确的响应吗?如果是,请检查您的AsyncTask是否返回null

 @Override
        protected void onPostExecute(List<ForecastWeatherList> result) {
            super.onPostExecute(result);
            if (result != null) {
                Log.e(TAG, "populate UI recycler view with gson converted data");
                listener.afterSearch(result);
            } else{
                Log.e(TAG, "Result is null");
                // check if this Log shows up?
           }
        }

更改您的服务URL

  

this.serviceUrl =“ http://api.openweathermap.org/data/2.5/forecast?q=”   +“巴尔的摩” +“&appid =” + api_key

答案 2 :(得分:0)

您的回复中的错误。 您的代码

ForecastWeatherListWrapper weatherWrapper = new Gson().fromJson(bufferedReader, ForecastWeatherListWrapper.class);

将响应转换为自定义对象。 因此响应必须以“ {”开头 但是您的响应以数组“ [”

开头

您必须修复响应或使自定义对象期望像这样的数组

   Gson gson = new Gson();
        Type type = new TypeToken<List<ForecastWeatherListWrapper>>() {
        }.getType();
        if (!bufferedReader.equals("")) {
         ForecastWeatherListWrapper weatherWrapper = gson.fromJson(bufferedReader, type);
        }