连接到服务器获取数据
在这里我给出两种方法
方法(1)
新建接口HttpCallbackListener,用于回调。
代码如下
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}
新建类HttpUtil用于和服务器进行数据交互
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtil {
public static void sendHttpRequest(final String address,final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection=null;
try{
URL url=new URL(address);
connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GRT");//这里采用GET方式提交数据,而不是POST
connection.setReadTimeout(8000);
connection.setConnectTimeout(8000);
InputStream in=connection.getInputStream();//获取数据流;
InputStreamReader inputStreamReader=new InputStreamReader(in);//读取字符流
BufferedReader reader=new BufferedReader(inputStreamReader);//从字符输入流中读取文本
StringBuilder response=new StringBuilder();//设置容量和长度
String line;
while ((line=reader.readLine())!=null){
response.append(line);//扩展容量
}
if(listener!=null){
listener.onFinish(response.toString());
}
} catch (Exception e) {
if(listener!=null){
listener.onError(e);
}
}finally {
if(connection!=null){
connection.disconnect();
}
}
}
}).start();
}
}
方法(2)
使用库okhttp3,导入库得方法笔记一中已经给出。
直接上代码
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class HttpUtil {
public static void sendOkHttpRequest(final String address, okhttp3.Callback callback){
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}
}
这样就可以了是不是很简单。
对数据进行解析
新建类Basic,在这里我使用gson对数据进行解析
import com.google.gson.annotations.SerializedName;
public class Basic{
@SerializedName("city")
public String cityName;
@SerializedName("id")
public String weatherId;
public Update update;
public class Update{
@SerializedName("loc")
public String updateTime;
}
}
public class AQI{
public AQICity city;
public class AQICity{
public String aqi;
public String pm25;
}
}
import com.google.gson.annotations.SerializedName;
public class Now{
@SerializedName("tmp")
public String temperature;
@SerializedName("cond")
public More more;
public class More{
@SerializedName("txt")
public String info;
}
}
import com.google.gson.annotations.SerializedName;
public class Suggestion {
@SerializedName("comf")
public Comfort comfort;
@SerializedName("cw")
public CarWash carWash;
public Sport sport;
public class Comfort {
@SerializedName("txt")
public String info;
}
public class CarWash {
@SerializedName("txt")
public String info;
}
public class Sport {
@SerializedName("txt")
public String info;
}
}
daily_forecast包含的是数组,数组中的每一项都代表着未来的天气,
import com.google.gson.annotations.SerializedName;
public class Forecast {
public String date;
@SerializedName("tmp")
public Temperature temperature;
@SerializedName("cond")
public More more;
public class Temperature {
public String max;
public String min;
}
public class More {
@SerializedName("txt_d")
public String info;
}
}
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class Weather {
public String status;
public Basic basic;
public AQI aqi;
public Now now;
public Suggestion suggestion;
@SerializedName("daily_forecast")
public List<Forecast> forecastList;
}
新建类Utility
import android.text.TextUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.example.dong.myapplication.db.City;
import com.example.dong.myapplication.db.County;
import com.example.dong.myapplication.db.Province;
import com.example.dong.myapplication.gson.Weather;
import com.google.gson.Gson;
public class Utility {
/**
* 解析和处理服务器返回的省级数据
*/
public static boolean handleProvinceResponse(String response) {
if (!TextUtils.isEmpty(response)) {
try {
JSONArray allProvinces = new JSONArray(response);
for (int i = 0; i < allProvinces.length(); i++) {
JSONObject provinceObject = allProvinces.getJSONObject(i);//循环遍历数组allProvinces
Province province = new Province();
province.setProvinceName(provinceObject.getString("name"));
province.setProvinceCode(provinceObject.getInt("id"));
province.save();
}
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
return false;
}
/**
* 解析和处理服务器返回的市级数据
*/
public static boolean handleCityResponse(String response, int provinceId) {
if (!TextUtils.isEmpty(response)) {
try {
JSONArray allCities = new JSONArray(response);
for (int i = 0; i < allCities.length(); i++) {
JSONObject cityObject = allCities.getJSONObject(i);
City city = new City();
city.setCityName(cityObject.getString("name"));
city.setCityCode(cityObject.getInt("id"));
city.setProvinceId(provinceId);
city.save();
}
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
return false;
}
/**
* 解析和处理服务器返回的县级数据
*/
public static boolean handleCountyResponse(String response, int cityId) {
if (!TextUtils.isEmpty(response)) {
try {
JSONArray allCounties = new JSONArray(response);
for (int i = 0; i < allCounties.length(); i++) {
JSONObject countyObject = allCounties.getJSONObject(i);
County county = new County();
county.setCountyName(countyObject.getString("name"));
county.setWeatherId(countyObject.getString("weather_id"));
county.setCityId(cityId);
county.save();
}
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
return false;
}
public static Weather handleWeatherResponse(String response){
try{
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("HeWeather");
String weatherContent = jsonArray.getJSONObject(0).toString();
return new Gson().fromJson(weatherContent,Weather.class);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
这里对数据JSON进行解析,采用Gson解析Json数据
可以参考 https://blog.csdn.net/huplion/article/details/78984977
,到这里我们获取数据,和解析数据就都完成了。