一、自定义异步的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. Uva12504 Updating a Dictonary

    这道题难度不大,主要是考察熟练运用C++的容器,字符串等操作. 另外注意特殊情况是否需要特殊处理.即当一个字典为空时,无论另一个字典是否有值,输出的结果都为No Change,这点需要注意一下. 另外 ...

  2. Linux下自带的regex

    Linux下可直接用regex.h来支持正则表达式. Android同样也有该头文件,可认为Android也是支持的. #include <sys/types.h> #include &l ...

  3. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...

  4. EChart 关于图标控件的简单实用

    1.下载前段框架并放入项目中去. 2.在js中调用 <!DOCTYPE html> <html lang="en"> <head> <me ...

  5. [原创]PostgreSQL Plus Advanced Server监控工具PEM(一)

    一.概述 PEM是为数据库管理员.系统架构师和性能分析师为管理.监控和优化 PostgreSQL 和 EnterpriseDB 数据库服务器设计的图形化管理工具.旨在解决大量数据库服务器跨地域.精细化 ...

  6. hdu 1237 简单计算器

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...

  7. 九度oj 1541 二叉树

    原题链接:http://ac.jobdu.com/problem.php?pid=1541 简答题如下: #include<algorithm> #include<iostream& ...

  8. zookeeper的一些异常总结

    1.Could not find the main class: org.apache.zookeeper.server.quorum.QuorumPeerMain.  Program will ex ...

  9. iOS之push present 动画

    直接源码: - (void) transitionWithType:(NSString *) type WithSubtype:(NSString *) subtype ForView : (UIVi ...

  10. iOS学习之Object-C语言类的扩展

    一.Category      1.Category:也叫分类,类目.是为没有源代码的类扩充功能.扩充的功能会成为原有类的一部分,可以通过原有类或者原有的对象直接调用,并且可继承.      2.注意 ...