Android Http异步请求,Callback
1 首先是HttpConnection,方法包括HttPost, HttpGet
package com.juupoo.common; import java.util.ArrayList;
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 org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils; import android.os.Bundle;
import android.os.Handler;
import android.os.Message; /**
* Asynchronous HTTP connections
*
* @author Greg Zavitz & Joseph Roth
*/
public class HttpConnection implements Runnable { public static final int DID_START = ;
public static final int DID_ERROR = ;
public static final int DID_SUCCEED = ; private static final int GET = ;
private static final int POST = ;
private static final int PUT = ;
private static final int DELETE = ;
private static final int BITMAP = ; private String url;
private int method;
private String data;
private CallbackListener listener; private HttpClient httpClient; // public HttpConnection() {
// this(new Handler());
// } public void create(int method, String url, String data, CallbackListener listener) {
this.method = method;
this.url = url;
this.data = data;
this.listener = listener;
ConnectionManager.getInstance().push(this);
} public void get(String url) {
create(GET, url, null, listener);
} public void post(String url, String data, CallbackListener listener) {
create(POST, url, data, listener);
} public void put(String url, String data) {
create(PUT, url, data, listener);
} public void delete(String url) {
create(DELETE, url, null, listener);
} public void bitmap(String url) {
create(BITMAP, url, null, listener);
} public interface CallbackListener {
public void callBack(String result);
} private static final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case HttpConnection.DID_START: {
break;
}
case HttpConnection.DID_SUCCEED: {
CallbackListener listener = (CallbackListener) message.obj;
Object data = message.getData();
if (listener != null) {
if(data != null) {
Bundle bundle = (Bundle)data;
String result = bundle.getString("callbackkey");
listener.callBack(result);
}
}
break;
}
case HttpConnection.DID_ERROR: {
break;
}
}
}
}; public void run() {
// handler.sendMessage(Message.obtain(handler, HttpConnection.DID_START));
httpClient = getHttpClient();
try {
HttpResponse httpResponse = null;
switch (method) {
case GET:
httpResponse = httpClient.execute(new HttpGet(
StaticInfos.Server_URL + url));
break;
case POST:
HttpPost httpPost = new HttpPost(StaticInfos.Server_URL
+ url);
List<NameValuePair> params = new ArrayList<NameValuePair>();
BasicNameValuePair valuesPair = new BasicNameValuePair("args",
data);
params.add(valuesPair);
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
httpResponse = httpClient.execute(httpPost);
if (isHttpSuccessExecuted(httpResponse)) {
String result = EntityUtils.toString(httpResponse
.getEntity());
this.sendMessage(result);
} else {
this.sendMessage("fail");
}
break;
}
} catch (Exception e) {
this.sendMessage("fail");
}
ConnectionManager.getInstance().didComplete(this);
} // private void processBitmapEntity(HttpEntity entity) throws IOException {
// BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
// Bitmap bm = BitmapFactory.decodeStream(bufHttpEntity.getContent());
// handler.sendMessage(Message.obtain(handler, DID_SUCCEED, bm));
// } private void sendMessage(String result) {
Message message = Message.obtain(handler, DID_SUCCEED,
listener);
Bundle data = new Bundle();
data.putString("callbackkey", result);
message.setData(data);
handler.sendMessage(message); } public static DefaultHttpClient getHttpClient() {
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, );
HttpConnectionParams.setSoTimeout(httpParams, );
// HttpConnectionParams.setSocketBufferSize(httpParams, 8192); DefaultHttpClient httpClient = new DefaultHttpClient(httpParams);
return httpClient;
} public static boolean isHttpSuccessExecuted(HttpResponse response) {
int statusCode = response.getStatusLine().getStatusCode();
return (statusCode > ) && (statusCode < );
} }
2 ConnectionManager类,将线程添加到队列中
package com.juupoo.common; import java.util.ArrayList; /**
* Simple connection manager to throttle connections
*
* @author Greg Zavitz
*/
public class ConnectionManager { public static final int MAX_CONNECTIONS = ; private ArrayList<Runnable> active = new ArrayList<Runnable>();
private ArrayList<Runnable> queue = new ArrayList<Runnable>(); private static ConnectionManager instance; public static ConnectionManager getInstance() {
if (instance == null)
instance = new ConnectionManager();
return instance;
} public void push(Runnable runnable) {
queue.add(runnable);
if (active.size() < MAX_CONNECTIONS)
startNext();
} private void startNext() {
if (!queue.isEmpty()) {
Runnable next = queue.get();
queue.remove();
active.add(next); Thread thread = new Thread(next);
thread.start();
}
} public void didComplete(Runnable runnable) {
active.remove(runnable);
startNext();
} }
3 调用:
new HttpConnection().post("user.login", args, callbackListener); private CallbackListener callbackListener = new HttpConnection.CallbackListener() {
@Override
public void callBack(String v) {
if(v != "fail") {
if("false".equals(v)) {
LoginActivity.this.showInfo(R.string.username_or_pass_error);
} else {
// 登录
Intent intent = new Intent();
intent.setClass(LoginActivity.this, MainActivity.class);
LoginActivity.this.startActivity(intent);
}
} else {
LoginActivity.this.showInfo(R.string.network_transfer_error);
}
progressDialog.dismiss();
}
};
可参考本文。
http://masl.cis.gvsu.edu/2010/04/05/android-code-sample-asynchronous-http-connections/
文章出处:http://blog.csdn.net/jkguang/article/details/7028565
Android Http异步请求,Callback的更多相关文章
- 将已经存在的异步请求callback转换为同步promise
由于js是单线程执行,为防止阻塞,会有很多异步回调函数callback,嵌套层次多了,可读性就差了很多.随着社区的发展,出现了promise.我们来将一些常见的回调函数做修改,变成promise的链式 ...
- 实现在Android简单封装类似JQuery异步请求
在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...
- Android简单封装类似JQuery异步请求
在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...
- Android 异步请求通用类
package com.example.demo1; import java.util.EventListener; public interface MyAsyncTaskListener exte ...
- Android含文档server结束(client UI接口异步请求的一部分)三
在本文中,AsyncTask为了实现异步请求,详细代码如下所示的: public class downloadActivity extends Activity { private TextView ...
- Android okHttp网络请求之Get/Post请求
前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...
- Android之网络请求库
自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...
- libcurl的封装,支持同步异步请求,支持多线程下载,支持https
最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以 ...
随机推荐
- javascript中可处理的浮点数的最高精度(和小数的一些小特性)
1.之前在度娘那找了一下关于javascript中可处理的浮点数的最高精度的问题,但找了好久也找不到,于是自己 小小的研究了一下,之前以为是17,后来测到18,再后来又测到19,经过一系列的改写,得到 ...
- windows----composer、laravel安装
环境要求:php+apache,并且将php的根目录配置到“环境变量”. 1.安装composer 使用cmd进入想要安装composer的目录执行如下命令,下载composer.phar文件: ph ...
- C++类继承中的构造函数和析构函数 调用顺序
思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...
- Oracle监控指标
1.数据文件或数据设备 参考:http://f.dataguru.cn/thread-106901-1-1.html2.数据库日志空间活或回滚段(包括大小.设备.文件及可用率.日志空间竞争情况或回滚段 ...
- Oracle10g安装中遇到的错误及解决办法
linux解决xhost: unable to open display实用技巧:在Linux下设置xhost方法步骤 第一步:用root登陆linux,启动vnc服务:第二步:根据vnc起来的端口, ...
- C语言的本质(18)——函数的可变参数
一般而言,在设计函数时会遇到许多数学和逻辑操作,是需要一些可变功能.例如,计算数字串的总和.字符串的联接或其它操作过程. 实现一个函数,要求在函数中计算传入的所有参数之和,并输出到屏幕上.这个函数实现 ...
- PDF转word文档
本文未对扫描版的PDF实验,但是可编辑PDF版本可以转换为word而且转换后的word是可编辑的. 1.从http://xiazai.zol.com.cn/detail/33/326858.shtml ...
- MIN (Transact-SQL)【转】
MIN (Transact-SQL) 其他版本 SQL Server 2005 此主题尚未评级 - 评价此主题 返回表达式中的最小值. 后面可能跟随 OVER 子句. Transact-S ...
- A Game with Colored Balls
题目链接 题意: 给一个长度为n的字符串,每次删除字母同样切连续的串,假设有多个,删除最左边的.最长的串.每次删除输出串的字母,每一个字母的下标(1-n) N (1 ≤ N ≤ 106),串仅仅包含r ...
- 初探swift语言的学习笔记七(swift 的关健词)
每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension, func, impor ...