android 请求url,Android随笔-Android 网络请求 (HttpURLConnection)

这篇写本身在进行Android学习的时候是如何进行网络请求的。

在进行开发的时候,不管如何都是绕不开网络请求的。咱们通常都是Android - 服务器 - 数据库,而后再接收返回的数据。这一套流程走下来就是一个Android的请求。下面就开始讲如何实现这个请求。

在讲这个以前,首先说一个Android开发者必须知道的知识:Android的主线程不要作耗时操做,不然会发生ANR(Application Not Responding)。而网络请求就是一个耗时操做。web

所以,针对于Android的网络请求,咱们都是开辟一个新的线程进行,以下:数据库

new Thread(new Runnable() {

@Override

public void run() {

HttpClient client = new DefaultHttpClient();

HttpPost post = new HttpPost(url);

try{

UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity(params, "utf-8");

post.setEntity(reqEntity);

HttpResponse httpResponse = client.execute(post);

if(httpResponse.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK) {

HttpEntity entity = httpResponse.getEntity(); // 取出报文的具体内容

String response = EntityUtils.toString(entity, "utf-8"); // 报文编码

listener.tackAction(response);

}

}catch (IOException ioe){

ioe.printStackTrace();

}

}

}).start();

那么,咱们怎么去更改UI呢?Android的UI都是由主线程进行控制的,所以,子线程的网络请求结果应该反馈给主线程。

如今,注意这行代码:listener.tackAction(response); 这个很重要,这是一个监听器,它在咱们访问网络请求成功后,执行一个方法,该方法的参数就是返回结果,那么咱们就能够利用这个方法进行修改UI(这实际上是一种设计模式,读者能够去查查属于哪一种设计模式。)

这里说错了,这里不能直接更改UI,由于这里仍属于子线程,他是子线程中执行的方法,因此不是主线程,咱们只是可以经过回调机制获取网络请求的数据,那么若是要更改UI,则须要主线程,所以咱们须要将数据给主线程,这个通常都是经过Handler。代码大概以下:json

private Handler handler = new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(@NonNull Message message) {

//让主线程进行UI修改,这个handler能够设置为全局量。

return true;

}

});)

而后在回调方法中进行使用handler:设计模式

下面的doAction是我本身某个程序中的回调方法。缓存

@Override

public void doAction(ReceiveBean receive) {

String from = receive.getFrom();

String message = receive.getMessage();

Log.i("ChatActivity", "doAction: "+message);

ViewBean viewBean = new ViewBean(message, from, HTalk.RECEIVE);

arrayList.add(viewBean);

Message message = new Message();

handler.sendMessage(message);

}

能够注意这些语句。这是调用前面的handler,将消息传递给主线程,让主线程进行一些操做。message也能够存储一些数据。服务器

Message message1 = new Message();

handler.sendMessage(message);

所以,整个网络请求的流程就出来了。

主线程传一个监听接口(观察者)给子线程,

而后activity实现这个接口的方法,

子线程进行网络请求,

网络请求成功之和,接口就会执行实现的方法。

而后在回调方法中经过Handler将数据传递给主线程,让主线程完成一些操做网络

这是一种最基本的访问网络请求的方式。我常常用这种方式,由于感受这种方式还能够,不算很麻烦,还能实现目的。

这种网络请求是短链接方式,长链接方式比较复杂,可是也是必须的。惋惜我没实现。为何说是必须的呢?由于,有时候咱们须要服务器“主动”发过来的消息,好比更新数据。若是,我把长链接写好了我就来更新(估计大几率会使用轮询实现)。

轮询实现(十分简易的轮询):

就是在每次进行网络申请是,利用sleep进行休眠,而后一直while循环。知道链接失败跳出。

这种轮询是十分暴力的。彷佛有优化的方法可是我不知道。app

@Override

public void run() {

try{

final URL url = new URL("your host ip");

while(true){

try {

Thread.sleep(3000);

HttpURLConnection connection = (HttpURLConnection)url.openConnection();

connection.setConnectTimeout(5 * 1000);

connection.setReadTimeout(5 * 1000);

connection.setRequestMethod("POST");

connection.connect();

if (connection.getResponseCode() == 200) {

String data = StreamUtils.getData(connection.getInputStream());

mListener.doAction(data);

}else {

break;

}

Log.i("LoopRunnable", "run: 1");

connection.disconnect();

}catch (InterruptedException ie){

ie.printStackTrace();

}

}

}catch (IOException ioe){

ioe.printStackTrace();

}

}

我上次好像不知道从哪看到,如今好像Android的网络请求通常都用HttpURLConnection,不多用HttpClient。我下次再去查查是否是对的,我也不太肯定。ide

最近使用了一次HttpURLConnection 进行网络请求。有几个错误,写下来记录一下。

首先HttpURLConnection的使用步骤:

一、建立一个URL对象,以下:svg

URL url = new URL(serverHost);

我本身写的时候发生了一个链接错误。首先,serverHost能够是域名,好比www.baidu.com,也能够是IP加端口号,可是若是是IP:port的形式,必须注明以什么传输协议进行链接,也就是说应该在你的IP前面加上http://或者https://。

二、就能够进行一些基本的HttpURLConnection设置。以下:(不是都须要设置)

HttpURLConnection connection = (HttpURLConnection)url.openConnection();

// 设置链接超时时间

connection.setConnectTimeout(5 * 1000);

//设置从主机读取数据超时

connection.setReadTimeout(5 * 1000);

// Post请求必须设置容许输出 默认false

/connection.setDoOutput(true);

//设置请求容许输入 默认是true

connection.setDoInput(true);

// Post请求不能使用缓存

connection.setUseCaches(false);

// 设置为Post请求

connection.setRequestMethod("POST");

//设置本次链接是否自动处理重定向

connection.setInstanceFollowRedirects(true);

// 配置请求Content-Type

connection.setRequestProperty("Content-Type", "application/json");

// 开始链接

connection.connect();

三、上面的结束以后就能够进行真正的网络请求,以下:

// 发送请求参数

DataOutputStream dos = new DataOutputStream(connection.getOutputStream());

dos.write(bytes);

dos.flush();

dos.close();

用过httpClient的都知道,咱们习惯的参数是K-V的形式,可是这里传输的是bytes。其实bytes就是K-V转化来的,他的过程是这样的:

先将K-V转换成 K1 = V1 & K2 = V2。。。的形式(就是get的形式)

而后将这个字符串转换成bytes。

这里须要注意:1)转换过程当中的编码(须要统一,我设置的是UTF-8),2)在servlet中,request进行解码时,须要加上下面这行,设置request的解析编码,和你以前的统一就行

try{

request.setCharacterEncoding("UTF-8");

}catch (UnsupportedEncodingException uee){

System.out.println("encoding error");

uee.printStackTrace();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值