Android基础 第四天

网络访问

记得做网络请求要加上权限!()

并且注意网络请求是一个耗时的操作,放在子线程里运行!

网络请求的骨架

//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() 方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值