一、自定义异步的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开源框架

loopj/android-async-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请求的更多相关文章

  1. iOS 多个异步网络请求全部返回后再执行具体逻辑的方法

    对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...

  2. Android中的异步网络请求

    本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...

  3. jmeter 异步子请求测试随笔

    好久没写技术类的博客了,都不知道自己都在忙啥.... 最近陆续遇到了一些异步子请求的测试需求,比如打开某一个页面A,A页面里的js会再调用B,C,D,E等请求,针对这个页面的测试,我最近做了一些思考: ...

  4. Java利用httpasyncclient进行异步HTTP请求

    Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...

  5. jquery.ajax异步发送请求的简单测试

    使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...

  6. JavaScript异步并发请求问题

    JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题

  7. Android Asynchronous Http Client-Android异步网络请求客户端接口

    1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...

  8. AJAX其实就是一个异步网络请求

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).其实就是一个异步网络请求. 一.创建对象 var xmlhttp; if (w ...

  9. IOS9中使用NSURLConection发送异步网络请求

    IOS9中使用NSURLConection发送异步网络请求 在ios9中,NSURLConection的sendSync..和sendAsync已经过时.被NSURLSession代替. 以下蓝色部分 ...

  10. 基于netty的异步http请求

    package com.pt.utils; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; im ...

随机推荐

  1. CentOS配置FTP(VSFTPD)

    一.vsftp安装篇 # 安装vsftpd yum -y install vsftpd # 启动 service vsftpd start # 开启启动 chkconfig vsftpd on 二.v ...

  2. 第一节 MongoDB介绍及下载与安装

    引言 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类 ...

  3. 通过Eclipse创建SQLite数据库

    import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database ...

  4. [转]命令行 Subversion 入门

    http://omyyal.iteye.com/blog/1762831 命令行 Subversion 入门 如果您参与的项目正在使用 Subversion 进行版本控制,您将需要使用 Subvers ...

  5. Python学习教程(learning Python)--1.1Python程序设计流程

    Python程序设计与其他高级语言程序设计流程基本一致     step1 程序设计     step2 编写Python代码     setp3 Python语句语法纠错     step4 测试程 ...

  6. cygwin

    setup-x86_64 -q -P wget,tar,qawk,bzip2,subversion,vim wget rawgit.com/transcode-open/apt-cyg/master/ ...

  7. 做自己的ORMapping Framework ---- 前序

    做一个应用系统,当然大多情况都会对数据库进行操作,什么样的model设计更加合理,怎样的数据库操作更有效率,什么样的额代码结构更好维护等等这些问题相信一定会困扰大多企业级系统开发的小伙伴们. 鉴于我正 ...

  8. 做HDU1010 带出来一个小问题

    做1010  本来是想的DFS深搜  但是自己凭空打  打不出来  因为没有记模板  然后就去搜  但是看了一遍  自己打却又是有BUG  然后验证  就出现了一个二维字符数组打印的问题 开始代码是这 ...

  9. DB2物化表

    DB2物化查询表(MQT)是DB2数据库中一类特殊的表 物化表和视图的区别 物化表是一个查询结果集,视图是一个SQL语句. 以下是一个简单例子(说明物化表) 1.创建表,插入测试数据 ----创建表 ...

  10. Java之XStream之下划线问题

    XStream将Java对象序列为XML, 如果对象属性带有下划线,输出到XML时会转成"__"双下划. 网上很多资料说是Bug, XStream开发的大神没有哪么笨吧? 查了一下 ...