• 家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)


    家庭洗车APP --- Android客户端开发 之 网络框架包介绍(一)


    上篇文章中给大家简单介绍了一些业务。上门洗车APP --- Android客户端开发 前言及业务简单介绍,本篇文章给大家介绍下网络框架。之前也了解过一些开源网络通讯架构。也大概看了一部分源代码。比方Afinal、Volley、AndBase、Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有非常多地方须要注意和优化。这里就不贴出来献丑了,感兴趣的朋友能够去查阅学习上面所说的那些开源项目,也能够查看之前整理的博客:Android开源框架(整理)进行相关学习。这里只是多介绍了。


    本项目採用的通讯框架是 Android-async-http,之前也写过一篇文章对其进行简单的介绍过。android-async-http开源项目介绍及用法。大家能够简单的了解下,本项目中基于该架构对数据的请求訪问及数据结果的返回做了一系列的封装。



    这里分享下我的思路和想法,和大家共同学习。对于发出的网络请求能够这样理解。Request --->  包含(请求时,请求中,请求成功,请求失败。请求结束),而server响应成功后取到数据。对数据结果进行解析。存储等处理。主要的框架都是这样。个人认为此处不够完好,总感觉返回请求数据的地方能够再次处理,进一步进行优化。那该怎么样呢?


    我是这样想的,发出请求后。获取的数据希望是已经解析完毕的数据,而不是从返回结果中再去解析。也就是说。请求完毕后已经将数据结果Result进行了解析,返回的Result已经是可直接使用的对象。这种话,整个请求解析就方便多了。


    那么究竟效果怎样呢?我们来看例如以下的一个登录请求样例:

    private void login(String name,String pwd){
    		GenericDataManager mDataManager = GenericDataManager.getInstance();//通用网络管理类
    		RequestParams mParams = RequestParameterFactory.getInstance().login(name, pwd);//请求參数管理类
    		mDataManager.dataRequest(0,Constants.REQUEST.GET, RequestURL.URL_LOGIN, mParams,new ResultParser(), this);//运行网络请求
    	}


    仅仅须要 3行代码 便可发起一个请求。那么详细在 Activity 中怎样使用呢?我们向外抛了一个IRequestCallback请求响应回调接口,该接口提供了三个回调方法。供 Activity 实现即:

    /**
     * IRequestCallback of Washer
     * 请求响应回调接口
     * @author gao_chun
     */
    public interface IRequestCallback {
    
        public void onRequestStart(int requestId);//開始请求
    
        public void onRequestSuccess(int requestId,int statusCode,Result<?> result);//请求成功,返回请求Id,状态响应码。数据结果(解析后的数据对象)
    
        public void onRequestError(int requestId,Throwable error);//请求错误
    
    }


    注:requestId 即请求 id,目的是为了区分哪一个请求。比方:一个 Activity 中须要有两次或很多其它次的请求,怎样在回调中区分详细的哪一个请求呢?使用 requestId 区分便可。

    仅仅须要在 Activity 中实现该接口,实现详细方法,便可得到数据:

    /*******************************************************************************
     *
     * Copyright (c) Weaver Info Tech Co. Ltd
     *
     * LoginActivity
     *
     * app.ui.activity.LoginActivity.java
     * TODO: File description or class description.
     *
     * @author: gao_chun
     * @since:  2015-6-23
     * @version: 1.0.0
     *
     * @changeLogs:
     *     1.0.0: First created this class.
     *
     ******************************************************************************/
    package org.gaochun.activity;
    
    /**
     * @author gao_chun
     *
     */
    public class LoginActivity extends TitleActivity implements IRequestCallback{
    
    	public Context context;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		context = this;
    		initUI();
    
    	}
    
    	private void initUI() {
    		setContentView(R.layout.activity_login);
    		setTitle(R.string.text_login);
    	}
    
    
    	@Override
    	public void onRequestStart(int requestId) {//onRequestStart
    		//此处能够显示Dialog
    	}
    
    	@Override
    	public void onRequestSuccess(int requestId, int statusCode, Result<?> result) {	//onRequestSuccess
    
    		Log.i(TAG,result.getMessage()+"--"+result.getStatus()+"--"+result.getData());//数据打印
    
    	}
    
    	
    	@Override
    	public void onRequestError(int requestId, Throwable error) {		//onRequestError
    
    		Log.e(TAG,error.getMessage());//请求失败。错误打印信息
    
    	}
    
    }
    

    有没有感觉还是挺简便的赶脚?说了那么多,以下我们来进一步配合代码进行了解。


    之前博文介绍过,使用该框架两种方式:

    第一种 是将 releases 包中的最新jar复制到应用的 libs 文件夹下

    另外一种 是将 library 里的项目源代码复制到你应用的 src 文件夹下(这里採用的是另外一种方式)

    以下是AsyncHttpClient简单用法。即创建一个请求

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://www.google.com", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            System.out.println(response);
        }
    });

    注:该框架可运行多种网络请求,包含 getputpostheaddelete 。有关不同请求的介绍,大家不了解的能够去查阅资料了解相关差异,这里就不介绍了。



    我们就是对 AsyncHttpClient类进行了处理。上面运行请求时有出现这两行代码:

    GenericDataManager mDataManager = GenericDataManager.getInstance();//通用网络管理类
    
    mDataManager.dataRequest(0,Constants.REQUEST.GET, RequestURL.URL_LOGIN, mParams,new ResultParser(), this);//运行网络请求

    GenericDataManager是什么玩意呢?


    这个类是封装的一个通用数据请求类,以下给出这个类,结合凝视大家能够了解学习:

    /*******************************************************************************
     *
     * Copyright (c) Weaver Info Tech Co. Ltd
     *
     * DataManager
     *
     * app.backend.manager.DataManager.java
     * 用来訪问server上的数据
     *
     * @author: gao_chun
     * @since:  Jul 23, 2014
     * @version: 1.0.0
     *
     * @changeLogs:
     *     1.0.0: First created this class.
     *
     ******************************************************************************/
    package org.gaochun.android.http.manager;
    
    import java.io.File;
    
    import org.apache.http.Header;
    import org.gaochun.android.http.AsyncHttpClient;
    import org.gaochun.android.http.RequestParams;
    import org.gaochun.android.http.network.IRequestCallback;
    import org.gaochun.android.http.network.RequestCallBack;
    import org.gaochun.model.Result;
    import org.gaochun.parser.AbstractParser;
    import org.gaochun.utils.Log;
    
    import android.content.Context;
    import android.os.Handler;
    import android.os.Looper;
    
    
    /**
     * @author gao_chun
     * 通用数据通讯类,不涉及认证与授权的数据。
     * 这个类的任务:通过相应參数,获取数据对象。
     * 这个类不会涉及到URL地址。
     */
    public class GenericDataManager {
    
        private static final String TAG = GenericDataManager.class.getSimpleName();
    
        private static GenericDataManager sInstance;
        private final String mServerHost;	//server地址前缀
        private final Handler mHandler;		//运行异步回调的Handler
    
        private static AsyncHttpClient client;	//AsyncHttpClient对象
    
    
        // 设置超时时间
        static{
            client = new AsyncHttpClient();   //初始化AsyncHttpClient对象
            client.setTimeout(6 * 1000);     //设置超时时间(重要)
        }
    
    
        //单例
        public static GenericDataManager getInstance() {
            if (sInstance == null) {
                Log.e(TAG, "ConfigManager.initiate method not called in the application.");
            } // else ignored.
            return sInstance;
        }
    
        //须要在Application中初始化
        public static void initialize(Context applicationContext, String serverHost) {
            sInstance = new GenericDataManager(applicationContext, serverHost);
        }
    
    
        private GenericDataManager(Context applicationContext, String serverHost) {
    
            // 初始化Handler,用于在主线程中运行任务
            mHandler = new Handler(Looper.getMainLooper());
            // 初始化server地址
            mServerHost = serverHost;
        }
    
    
    
        /**
         * 该方法封装了网络数据请求和数据解析
         * 并传入回调接口
         * @param requestId     请求ID
         * @param requestType   请求类型(此处依据传入的常量仅仅提供了get请求和post请求)
         * @param urlString     请求URL
         * @param mParams       请求參数
         * @param parser        通用数据解析抽象解析器
         * @param mCallback     自己定义接口回调
         */
    
        private RequestCallBack mRequestCallBack;	//该抽象类继承了AsyncHttpResponseHandler,并重写了回调方法
    
    
        public <T> void dataRequest(final int requestId,String requestType,String urlString,RequestParams mParams,
                final AbstractParser<T> mParser,final IRequestCallback mCallback){
    
            Log.i(TAG,"url:--->"+mServerHost + File.separator + urlString);
    
            //请求数据開始之前的回调
            if (mCallback != null) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mCallback.onRequestStart(requestId);
                    }
                });
            } // else ignored
    
    
            //实例化回调对象
            mRequestCallBack = new RequestCallBack() {
    
                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
    
                    String data = new String(responseBody);	//获取数据结果
                    //Log.d(TAG,"server获取数据:"+data);
                    final Result<T> result = mParser.parse(data);	//解析类
                    if (result != null) {
                        //return the requestId + statusCode + result
                        mCallback.onRequestSuccess(requestId,statusCode,result);	//返回请求成功且解析完毕的数据回调
                    } // else ignored.
                }
    
                @Override
                public void onStart() {
                    if (mCallback != null) {
                        mCallback.onRequestStart(requestId);
                    } // else ignored
                }
    
                @Override
                public void onFailure(int statusCode, Header[] headers,
                        byte[] responseBody, Throwable error) {
    
                    if (mCallback != null) {
                        mCallback.onRequestError(requestId,error);
                    } // else ignored
                }
            };
    
            //依据传入的 requestType 来switch详细的请求方式(注:JDK1.7中switch()支持字符串常量)
            switch (requestType) {
                case Constants.REQUEST.GET:
                    client.get(mServerHost + File.separator + urlString, mParams,mRequestCallBack);
                    break;
    
                case Constants.REQUEST.POST:
                    client.post(mServerHost + File.separator + urlString, mParams,mRequestCallBack);
                    break;
    
                default:
                    client.get(mServerHost + File.separator + urlString, mParams,mRequestCallBack);
                    break;
            }
        }
    
    }
    

    我们须要注意的是该方法中传入的參数,且使用了泛型 <T> :

    /**
         * 该方法封装了网络数据请求和数据解析
         * 并传入回调接口
         * @param requestId     请求ID
         * @param requestType   请求类型(此处依据传入的常量仅仅提供了get请求和post请求)
         * @param urlString     请求URL
         * @param mParams       请求參数
         * @param parser        通用数据解析抽象解析器
         * @param mCallback     自己定义接口回调
         */
    public <T> void dataRequest(final int requestId,String requestType,String urlString,RequestParams mParams,
                final AbstractParser<T> mParser,final IRequestCallback mCallback)


    将请求參数,请求类型,请求URL。解析器。回调,传入这种方法中进行处理,回调成功直接取数据



    假设项目中须要用到头像上传,下载 等功能,Android-async-http 项目中已经提供了相应的方法,大家能够自己在该类中封装方法。


    忙里偷闲的挤时间整理了这篇文章。目的是先给大家简单的介绍框架的使用,让感兴趣的朋友有所了解,下篇博文中会给大家详细介绍dataRequest中的抽象解析类 及 请求參数封装 RequestParameterFactory类,当然也须要整理好源代码后给大家共享学习。


    假设认为有须要改进的地方或者好的想法,欢迎大家发表意见。



    上门洗车APP --- Android客户端开发 前言及业务简单介绍

    上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)

    上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二)

    上门洗车APP --- Android客户端开发 之 项目结构介绍



    【注:转载注明gao_chun的BLOG http://blog.csdn.net/gao_chun/article/details/46610555


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    C#中的委托是什么?事件是不是一种委托?
    SQL重点复习
    数据库生成脚本
    用Winfrom动态生成SQL的insert语句
    如何实现远程连接SQL Server 2008 Express
    跨页面传送
    win7 防火墙开启ping
    关于*.class和*.jar的几个基本认识
    使用cobertura确定测试代码的覆盖率
    Java学习笔记之I/O
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4905251.html
Copyright © 2020-2023  润新知