• Android 异步Http框架简介和实现原理


    在前几篇文章中《Android 采用get方式提交数据到服务器》《Android 采用post方式提交数据到服务器Android 采用HttpClient提交数据到服务器介绍了android的两种提交数据到服务器的方法

    本文将介绍另外一种基于框架android-async-http的方法来实现

    android-async-http是一个强大的网络请求库,这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。android-async-http是一个强大的第三方开源网络请求库

    官网源码:https://github.com/loopj/android-async-http

    官网教程:http://loopj.com/android-async-http/

    新建项目,先到github上:https://github.com/loopj/android-async-http/tree/1.4.0

    下载相应的zip文件,解压缩后将src中的com文件夹复制到项目的src目录

    下面使用框架android-async-http,代码如下:

    package com.wuyudong.asynchttp;
    
    import java.net.URLEncoder;
    
    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.AsyncHttpResponseHandler;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View view) {
            // 用户名密码提交到服务器
            AsyncHttpClient client = new AsyncHttpClient();
            String path = "http://169.254.168.71:8080/web/LoginServlet?username="
                    + URLEncoder.encode("wuyudong") + "&password="
                    + URLEncoder.encode("123");
    
            client.get(path, new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(String content) {
                    // TODO Auto-generated method stub
                    super.onSuccess(content);
                    Toast.makeText(MainActivity.this, "请求成功!", 0).show();
                }
    
                @Override
                public void onFailure(Throwable error, String content) {
                    // TODO Auto-generated method stub
                    super.onFailure(error, content);
                    Toast.makeText(MainActivity.this, "请求失败!", 0).show();
                }
            });
    
        }
    
    }

    可以看到代码量减少了很多


    下面来实现一个精简版的异步框架

    新建项目

    AsyncHttpClient.java

    package com.wuyudong.AsyncClient;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    
    import android.os.Message;
    
    public class AsyncHttpClient {
    
        public void get(final String path, final MyHandler myHandler) {
    
            new Thread() {
                @Override
                public void run() {
    
                    HttpClient client = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(path);
    
                    try {
                        HttpResponse response = client.execute(httpGet);
                        InputStream is = response.getEntity().getContent();
                        String content = StreamTools.readInputStream(is);
    
                        // 执行成功
                        Message msg = new Message();
                        msg.what = 0;
                        msg.obj = "请求成功";
                        myHandler.sendMessage(msg);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                        // 执行失败
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = "请求失败";
                        myHandler.sendMessage(msg);
                    }
    
                }
            }.start();
    
        }
    
    }

    MainActivity.java

    package com.wuyudong.AsyncClient;
    
    import java.net.URLEncoder;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View view) {
            // 1、开启子线程 执行一个http请求,在后台执行 在子线程执行
    
            // 2、 子线程执行完毕后通知ui界面
    
            AsyncHttpClient client = new AsyncHttpClient();
            String path = "http://169.254.168.71:8080/web/LoginServlet?username="
                    + URLEncoder.encode("wuyudong") + "&password="
                    + URLEncoder.encode("123");
            client.get(path, new MyHandler() {
                @Override
                public void onFailure(String content) {
                    Toast.makeText(MainActivity.this, content, 1).show();
                    super.onFailure(content);
    
                }
    
                @Override
                public void onSuccess(String content) {
                    Toast.makeText(MainActivity.this, content, 0).show();
                    super.onSuccess(content);
    
                }
            });
    
        }
    }

    MyHandler.java

    package com.wuyudong.AsyncClient;
    
    import android.os.Handler;
    import android.os.Message;
    
    public class MyHandler extends Handler {
        public void onFailure(String content) {
    
        }
    
        public void onSuccess(String content) {
    
        }
    
        @Override
        public void handleMessage(Message msg) {
            String content = (String) msg.obj;
            switch (msg.what) {
            case 0:
                onSuccess(content);
                break;
    
            case 1:
                onFailure(content);
                break;
            default:
                break;
            }
            super.handleMessage(msg);
        }
    }

    StreamTools.java

    package com.wuyudong.AsyncClient;
    
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    
    public class StreamTools {
        /**
         * 把输入流的内容转化成字符串
         * 
         * @param is
         * @return
         */
        public static String readInputStream(InputStream is) {
            try {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int len = 0;
                byte[] buffer = new byte[1024];
                while ((len = is.read(buffer)) != -1) {
                    baos.write(buffer, 0, len);
                }
                is.close();
                baos.close();
                byte[] result = baos.toByteArray();
    
                String str = new String(result);
                // 试着解析result里面的字符串
                if (str.contains("gb2312")) {
                    return new String(result, "gb2312");
                } else if(str.contains("utf-8")){
                    return str;
                } else {
                    return null;
                }
                
                //return new String(result, "gb2312");
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
    
        }
    
    }
  • 相关阅读:
    MySQL Replication主从复制
    使用Amoeba 实现MySQL DB 读写分离
    Amoeba For MySQL入门:实现数据库水平切分
    11条理由告诉你,为什么你的网站不卖座
    很有用的观察者设计模式
    Apache + Tomcat集群配置详解 (1)
    Nginx+tomcat配置负载均衡
    JSON-RPC轻量级远程调用协议介绍及使用
    nginx的upstream目前支持5种方式的分配
    rpc远程过程协议调用
  • 原文地址:https://www.cnblogs.com/wuyudong/p/5627259.html
Copyright © 2020-2023  润新知