异步HTTP请求
一、自定义异步的HTTP请求
1.自定义一个AsyncHttpClient类,用于处理HTTP请求,实际原理就是新开启一个线程,调用HttpClient处理GET和POST请求
package com.shz.services; import java.util.List; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient; import android.os.Message; public class MyAsyncHttpClient { public void get(final String url,final MyHandler handler)
{
new Thread(){
public void run() {
Message msg = new Message();
try {
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);
int code = response.getStatusLine().getStatusCode();
if(code == 200)
{
msg.what = 1;
msg.obj = loginService.readInputStream(response.getEntity().getContent());
}
else
{
msg.what = 2;
msg.obj = "请求失败,错误码:"+code;
} } catch (Exception e) {
msg.what = 2;
msg.obj = e.getMessage();
} finally{
handler.sendMessage(msg);
}
};
}.start();
} public void post(final String url,final List<NameValuePair> pairs,final MyHandler handler)
{
new Thread(){
public void run() {
Message msg = new Message();
try {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url); if(pairs != null)
{
post.setEntity(new UrlEncodedFormEntity(pairs, "UTF-8"));
} HttpResponse response = client.execute(post);
int code = response.getStatusLine().getStatusCode();
if(code == 200)
{
msg.what = 1;
msg.obj = loginService.readInputStream(response.getEntity().getContent());
}
else
{
msg.what = 2;
msg.obj = "请求失败,错误码:"+code;
}
} catch (Exception e) {
msg.what = 2;
msg.obj = e.getMessage();
} finally{
handler.sendMessage(msg);
}
};
}.start();
}
}
2.处理服务器返回消息的MyHandler类,该类继承Handler
package com.shz.services; import android.os.Handler;
import android.os.Message; public class MyHandler extends Handler {
public void onSuccess(String content) { } public void onFailure(String content) { } @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
onSuccess(msg.obj.toString());
break;
case 2:
onFailure(msg.obj.toString());
break;
default:
break;
}
} }
3.测试代码
package com.shz.login; import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List; import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair; import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; import com.shz.myasynchttp.R;
import com.shz.services.MyAsyncHttpClient;
import com.shz.services.MyHandler; public class MainActivity extends Activity { private EditText txtUserName;
private EditText txtPassword; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); this.txtUserName = (EditText)this.findViewById(R.id.txtUserName);
this.txtPassword = (EditText)this.findViewById(R.id.txtPassword);
} public void loginGet(View view)
{
final String userName = this.txtUserName.getText().toString().trim();
final String password = this.txtPassword.getText().toString().trim(); if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password))
{
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
return;
} String path = "http://192.168.1.101/MyWebSite/AndroidTest/Home/Login?UserName="
+ URLEncoder.encode(userName)
+ "&Password="
+ URLEncoder.encode(password); MyAsyncHttpClient client = new MyAsyncHttpClient();
client.get(path, new MyHandler(){ @Override
public void onSuccess(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} @Override
public void onFailure(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} });
} public void loginPost(View view)
{
final String userName = this.txtUserName.getText().toString().trim();
final String password = this.txtPassword.getText().toString().trim(); if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password))
{
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
return;
} String path = "http://192.168.1.101/MyWebSite/AndroidTest/Home/Login";
MyAsyncHttpClient client = new MyAsyncHttpClient();
// 设置要提交的数据
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("UserName", userName));
pairs.add(new BasicNameValuePair("Password", password));
client.post(path, pairs, new MyHandler(){ @Override
public void onSuccess(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} @Override
public void onFailure(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} });
} }
布局代码
package com.shz.login; import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List; import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair; import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; import com.shz.myasynchttp.R;
import com.shz.services.MyAsyncHttpClient;
import com.shz.services.MyHandler; public class MainActivity extends Activity { private EditText txtUserName;
private EditText txtPassword; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); this.txtUserName = (EditText)this.findViewById(R.id.txtUserName);
this.txtPassword = (EditText)this.findViewById(R.id.txtPassword);
} public void loginGet(View view)
{
final String userName = this.txtUserName.getText().toString().trim();
final String password = this.txtPassword.getText().toString().trim(); if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password))
{
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
return;
} String path = "http://192.168.1.101/MyWebSite/AndroidTest/Home/Login?UserName="
+ URLEncoder.encode(userName)
+ "&Password="
+ URLEncoder.encode(password); MyAsyncHttpClient client = new MyAsyncHttpClient();
client.get(path, new MyHandler(){ @Override
public void onSuccess(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} @Override
public void onFailure(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} });
} public void loginPost(View view)
{
final String userName = this.txtUserName.getText().toString().trim();
final String password = this.txtPassword.getText().toString().trim(); if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password))
{
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
return;
} String path = "http://192.168.1.101/MyWebSite/AndroidTest/Home/Login";
MyAsyncHttpClient client = new MyAsyncHttpClient();
// 设置要提交的数据
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("UserName", userName));
pairs.add(new BasicNameValuePair("Password", password));
client.post(path, pairs, new MyHandler(){ @Override
public void onSuccess(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} @Override
public void onFailure(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
} });
} }
二、使用GitHub上的异步Http开源框架
示例代码
package com.shz.login; import java.net.URLEncoder; import org.apache.http.Header; import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.shz.asynchttp.R; public class MainActivity extends Activity { private EditText txtUserName;
private EditText txtPassword;
private CheckBox cbRememberPwd; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); this.txtUserName = (EditText)this.findViewById(R.id.txtUserName);
this.txtPassword = (EditText)this.findViewById(R.id.txtPassword);
this.cbRememberPwd = (CheckBox)this.findViewById(R.id.cbRememberPwd); } public void loginGet(View view)
{
final String userName = this.txtUserName.getText().toString().trim();
final String password = this.txtPassword.getText().toString().trim(); if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password))
{
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
return;
} String path = "http://192.168.1.101/MyWebSite/AndroidTest/Home/Login?UserName="
+ URLEncoder.encode(userName)
+ "&Password="
+ URLEncoder.encode(password); AsyncHttpClient client = new AsyncHttpClient();
client.get(path, new AsyncHttpResponseHandler() { @Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Toast.makeText(MainActivity.this, statusCode+":"+new String(responseBody), 1).show();
} @Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
Toast.makeText(MainActivity.this, statusCode+":"+new String(responseBody), 1).show();
}
});
} public void loginPost(View view)
{
final String userName = this.txtUserName.getText().toString().trim();
final String password = this.txtPassword.getText().toString().trim(); if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password))
{
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
return;
} String path = "http://192.168.1.101/MyWebSite/AndroidTest/Home/Login";
RequestParams params = new RequestParams();
params.put("UserName", userName);
params.put("Password", password);
AsyncHttpClient client = new AsyncHttpClient();
client.post(path, params, new AsyncHttpResponseHandler() { @Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Toast.makeText(MainActivity.this, statusCode+":"+new String(responseBody), 1).show();
} @Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
Toast.makeText(MainActivity.this, statusCode+":"+new String(responseBody), 1).show();
}
});
} }
异步HTTP请求的更多相关文章
- iOS 多个异步网络请求全部返回后再执行具体逻辑的方法
对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...
- Android中的异步网络请求
本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...
- jmeter 异步子请求测试随笔
好久没写技术类的博客了,都不知道自己都在忙啥.... 最近陆续遇到了一些异步子请求的测试需求,比如打开某一个页面A,A页面里的js会再调用B,C,D,E等请求,针对这个页面的测试,我最近做了一些思考: ...
- Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...
- jquery.ajax异步发送请求的简单测试
使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...
- JavaScript异步并发请求问题
JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题
- Android Asynchronous Http Client-Android异步网络请求客户端接口
1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...
- AJAX其实就是一个异步网络请求
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).其实就是一个异步网络请求. 一.创建对象 var xmlhttp; if (w ...
- IOS9中使用NSURLConection发送异步网络请求
IOS9中使用NSURLConection发送异步网络请求 在ios9中,NSURLConection的sendSync..和sendAsync已经过时.被NSURLSession代替. 以下蓝色部分 ...
- 基于netty的异步http请求
package com.pt.utils; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; im ...
随机推荐
- PHP实例 表单数据插入数据库及数据提取 用户注册验证
网站在进行新用户注册时,都会将用户的注册信息存入数据库中,需要的时候再进行提取.今天写了一个简单的实例. 主要完成以下几点功能: (1)用户进行注册,实现密码重复确认,验证码校对功能. (2)注册成功 ...
- Mongodb 3.0 创建用户
MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法. 创建第一个用户(该用户需要有grant权限,即:账号管理的授权权限) ...
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
- java 中 java.lang.ArrayIndexOutOfBoundsException: 0 异常
package test; public class Test { public static void main(String[] args) { final int num2 = Integer. ...
- [转载]--用Python 自动安装软件
脚本使用了 Python 2.3 + Com 对象,所以你的系统必须安装Python2.3或更高版本同时必须安装 Mark Hammond's Win32all 模块 (特别感谢Mark Hamm ...
- javascript 关于Date 时间类型 处理方法
上一篇博客中和大家分享了关于 字符串转时间类型 这一篇顺便整理下 javascript 中 Date 类型的一些方法 var time = new Date(); var year=time.getY ...
- IBM MQ扩大队列最大消息长度
要设置MQ的最大消息长度,需要考虑同时设置队列管理,队列以及通道的最大消息长度. 具体操作如下: runmqsc 队列管理器名称 alter qmgr maxmsgl(10000000) 1 : al ...
- Java使用JSP Tag Files & JSP EL Functions打造你自己的页面模板
1. 简单说明:在JSP 2.0后, 你不再需要大刀阔斧地定义一堆TagSupport或BodyTagSupport, 使用JSP Tag Files技术可以实现功能强大的页面模板技术. 在这里抛砖引 ...
- go语言值得学习的开源项目推荐
谷歌官方维护了一个基于go语言的开源项目列表: https://github.com/golang/go/wiki/Projects 其中有非常多的优秀项目值得学习,有几百行代码适合新手阅读的项目,也 ...
- JNI文件中命名类与JAVA文件中匹配
jni.c中注册中 int register_android_boa(JNIEnv *env){ jclass clazz; static const char* const kClass ...