网络访问
记得做网络请求要加上权限!()
并且注意网络请求是一个耗时的操作,放在子线程里运行!
网络请求的骨架
//1.url地址,并用URL类包装一下
String path = “http://wthrcdn.etouch.cn/weather_mini?city=“+URLEncoder.encode(cityname,”utf-8”);
URL url = new URL(path);
//2.通过url对象打开一个网络连接(注意类型转换!!),也可以设置一些额外参数,比如超时时间等
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“GET”); 请求方式(GET,POST 注意大小写)
conn.setConnectTimeout(5000);
//3.拿到服务器的返回码,看看是否连接成功了, 200为成功
int code = conn.getResponseCode();
if(code == 200){
//4,如果成功拿到服务器返回的流,
InputStream is = conn.getInputStream();
//一定要注意!! 我们需要知道流里面的内容来选择解析的方式
//假如流里面的内容是字符串,我们就用解析字符串的方式
String json = StreamTools.readStream(is);
//假如流里面的内容是图片,我们就用图片的解析方式
//Bitmap bitmap = BitmapFactory.decodeStream(is);
}
消息机制:
子线程不可以修改ui.
只有主线程才可以修改ui.
如果子线程想更新ui就必须利用消息机制处理
Handler : 消息处理器, 可以发送消息给主线程的消息队列.
Message Queue: 消息队列,主线程里面的一个消息队列.
Looper : 轮询器,检查消息队列里面是否有消息.—> HandleMessage();
注意,虽然在子线程里面能做耗时的操作,但是却不能更新UI,因此 需要用到android下的消息机制通知主线程去更新界面!
//1.定义一个消息处理器(秘书)
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//就在主线程里面了
String text = (String) msg.obj;
tv.setText(text);
super.handleMessage(msg);
}
};
//2,发送消息,拿到消息的方式有以下几种
Message msg = new Message();
Message.obtain;
handler.obtainMessage();
//obj 属性是用来带数据的,
msg.obj =”嘎嘎,哈哈哈,呱呱呱—-“;
//what 属性用来区分消息的类型!
msg.what = SUCCESS;
//发送消息
handler.sendMessage(msg);
以下是一些细节大家不要忽略掉了:
android端怎么处理乱码?
String temp = baos.toString();
if(temp.contains(“charset=utf-8”)){
return temp;
}else if(temp.contains(“gb2312”)){
return baos.toString(“gb2312”); //可以设置编码集
}return null;
ANR产生的原因?
application not response: 应用程序无响应 (阻塞了主线程)在主线程做了耗时的操作
如何在http请求中加入useragent,它有什么用?
conn.setReuqestProperty(“User-Agent”,”xxxxxxxxx”) 告诉服务器这个请求是从手机还是电脑端来的
怎么把一个inputStream转化为一个bitmap对象 或者转化为一个字符串?
//将流里面的内容转为bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is);
//流转成字符串
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!=-1){
baos.write(buffer, 0, len);
}
is.close();
String temp = baos.toString(); //默认情况下android手机是用的UTF-8编码
案例
天气预报案例-json数据的解析
重点有两个:
1,json的解析
看见花括号,代表着是一个JSONObject, 中括号是JSONARRAY
String json = StreamTools.readStream(is);
//把json字符串传入到JSONObject中
JSONObject jsonObj = new JSONObject(json);
//获取int型数据
jsonObj.getInt("status")
//看到一个花括号,又是一个Object
JSONObject dataJSON = jsonObj.getJSONObject("data");
//看到一个中括号就用getJSONArray
JSONArray array = dataJSON.getJSONArray("forecast");
2,怎么对一个字符串进行URL 编码(URL地址不支持中文!)
URLEncoder.encode() 方法