Android HTTP asynchronous request, callback

Source: Internet
Author: User

I have been developing mobile local applications with HTML5 before. Later I found that local applications developed with HTML5 are highly efficient in development and cross-platform, but there is still a gap between the experience and native applications.

HTML5 and remote interaction are developed using jsonp, Which is asynchronous. Android asynchronous mode is not the same. It adopts multi-thread and handler mode.

1. The first is httpconnection. The methods include httpost and 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() {@Overridepublic 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 class: Add a thread to the queue

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();}}

3 call:

New httpconnection (). post ("user. login ", argS, callbacklistener); Private callbacklistener = new httpconnection. callbacklistener () {@ overridepublic void callback (string v) {If (V! = "Fail") {If ("false ". equals (V) {loginactivity. this. showinfo (R. string. username_or_pass_error);} else {// log on to intent = new intent (); intent. setclass (loginactivity. this, mainactivity. class); loginactivity. this. startactivity (intent) ;}} else {loginactivity. this. showinfo (R. string. network_transfer_error);} progressdialog. dismiss ();}};

Refer to this article.

Http://masl.cis.gvsu.edu/2010/04/05/android-code-sample-asynchronous-http-connections/

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.