Android Http异步请求 Callback
之前一直在用HTML5开发移动本地应用,后来发现,实际上HTML5开发的本地应用,开发效率高,而且跨平台,但是体验,相应无法和原生应用,还有一定差距。
开发HTML5和远程交互,采用JSONP,是异步方式。Android的异步方式不太一样,采用的是多线程和Handler的方式处理。
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 = 0;
- public static final int DID_ERROR = 1;
- public static final int DID_SUCCEED = 2;
- private static final int GET = 0;
- private static final int POST = 1;
- private static final int PUT = 2;
- private static final int DELETE = 3;
- private static final int BITMAP = 4;
- 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, 20000);
- HttpConnectionParams.setSoTimeout(httpParams, 20000);
- // HttpConnectionParams.setSocketBufferSize(httpParams, 8192);
- DefaultHttpClient httpClient = new DefaultHttpClient(httpParams);
- return httpClient;
- }
- public static boolean isHttpSuccessExecuted(HttpResponse response) {
- int statusCode = response.getStatusLine().getStatusCode();
- return (statusCode > 199) && (statusCode < 400);
- }
- }
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 = 5;
- 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(0);
- queue.remove(0);
- active.add(next);
- Thread thread = new Thread(next);
- thread.start();
- }
- }
- public void didComplete(Runnable runnable) {
- active.remove(runnable);
- startNext();
- }
- }
- 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();
- }
- };
相关推荐
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
liuqipao 2020-07-07
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20