参考博文:
https://blog.youkuaiyun.com/huplion/article/details/78984977
https://blog.youkuaiyun.com/Mind_programmonkey/article/details/78438155
工具类
package com.welldones.door.utils;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class WeatherUtils {
private Context context;
private TextView tv_cloud;
private TextView tv_temper;
public WeatherUtils(Context context, TextView tv_cloud, TextView tv_temper) {
this.context = context;
this.tv_cloud = tv_cloud;
this.tv_temper = tv_temper;
}
private final static String PATH = "http://wthrcdn.etouch.cn/weather_mini?city=";
protected static final int SUCCESS = 0;
protected static final int INVALID_CITY = 1;
protected static final int ERROR = 2;
private Handler mhandler = new Handler() {
public void handleMessage(android.os.Message msg) {
// dialog.dismiss();
switch (msg.what) {
case SUCCESS:
JSONArray data = (JSONArray) msg.obj;
try {
// 当天的天气信息
String day01 = data.getString(0);
Log.e("Weather", "day01:" + day01);
// 后一天的天气信息
// String day02= data.getString(1);
Day day = parseJson(day01);
tv_cloud.setText(day.getType());
// 截取:低温5°C 中的后部分
String low = day.getLow().substring(2);
String high = day.getHigh().substring(2);
tv_temper.setText(low + "~" + high);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case INVALID_CITY:
Toast.makeText(context, "城市无效", Toast.LENGTH_SHORT).show();
break;
case ERROR:
Toast.makeText(context, "网络无效", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
;
};
// 解析json字符串
private Day parseJson(String json) {
if (TextUtils.isEmpty(json)) {
return null;
}
Day day = new Gson().fromJson(json, Day.class);
return day;
}
public void startWeather(final String city) {
//发起请求给那个网站
new Thread() {
public void run() {
try {
String ul = PATH + URLEncoder.encode(city, "UTF-8");
URL url = new URL(ul);
//设置必要的参数信息
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
//判断响应码
int code = conn.getResponseCode();
if (code == 200) {
//连接网络成功
InputStream in = conn.getInputStream();
String data = decodeStream(in);
//解析json格式的数据
JSONObject jsonObj = new JSONObject(data);
Log.e("Weather", "jsonObj:" + jsonObj);
//获得desc的值
String result = jsonObj.getString("desc");
if ("OK".equals(result)) {
//城市有效,返回了需要的数据
JSONObject dataObj = jsonObj.getJSONObject("data");
JSONArray jsonArray = dataObj.getJSONArray("forecast");
//通知更新ui
Message msg = Message.obtain();
msg.obj = jsonArray;
msg.what = SUCCESS;
mhandler.sendMessage(msg);
} else {
//城市无效
Message msg = Message.obtain();
msg.what = INVALID_CITY;
mhandler.sendMessage(msg);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Message msg = Message.obtain();
msg.what = ERROR;
mhandler.sendMessage(msg);
}
}
;
}.start();
}
private String decodeStream(InputStream in) throws IOException {
// 底层流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = 0;
byte[] buf = new byte[1024];
while ((len = in.read(buf)) > 0) {
baos.write(buf, 0, len);
}
String data = baos.toString();
return data;
}
}
使用
new WeatherUtils(this,tv_cloud,tv_temper).startWeather("南京");
用到了Gson解析Json,添加依赖库