之前一直在用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() {@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类,将线程添加到队列中

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 调用:

new HttpConnection().post("user.login", args, callbackListener);private CallbackListener 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 {    // 登录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/


更多相关文章

  1. Android四种启动Activity方式
  2. 07.Android之Bluetooth
  3. Android(安卓)Translucent System Bar 的最佳实践
  4. Android(安卓)判断当前线程是否是主线程的方法
  5. Handler&Looper
  6. handler机制
  7. android 仿QQ界面
  8. 【Android】Thread与Service的差异
  9. Android(安卓)唯一识别码

随机推荐

  1. Android读取彩信附件
  2. Android改变图片背景颜色tint(着色)或 ba
  3. Android(安卓)程式开发:(七)处理变化 —— 7
  4. Android中蓝牙的基本使用
  5. Android(安卓)SDK4.2 (API17) 开发环境的
  6. Android(安卓)Studio 布局文件格式化代码
  7. android xml解析之pull解析
  8. android Handler & HandlerThread
  9. Installation failed with message INSTA
  10. Android(安卓)databinding详解(一)--layo