家庭洗车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

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

时间: 2024-10-11 13:19:18

家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)的相关文章

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

上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidclient开发 前言及业务简单介绍 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(一) 本篇接着给大家分享网络框架封装.相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解.这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 data

上门洗车APP --- Androidclient开发 之 项目结构介绍

上门洗车APP --- Androidclient开发 之 项目结构介绍 前言 尽管公司项目较紧,但还是抽空给大家继续更新. o_O"~ 欢迎大家的关注,非常高兴和大家共同学习.前面给大家分享了项目中的以下内容: 上门洗车APP --- Androidclient开发 前言及业务简介 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(一) 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 之前有非常多朋友私信过来说想打包一份源代码学习

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

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下网络框架,之前也了解过一些开源网络通讯架构,也大概看了一部分源码,比如Afinal.Volley.AndBase.Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有很多地方需要注意和优化,这里就不贴出来献丑了,感兴趣的朋友可以去查阅学习上面所说的

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

上门洗车APP --- Android客户端开发 之 项目结构介绍 前言 虽然公司项目较紧,但还是抽出时间给大家继续更新.     o_O"~ 感谢大家的关注,很高兴和大家共同学习.前面给大家分享了项目中的以下内容: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二) 之前有很多朋友私信过来说想打包一份源码学习,由于本项目也是还

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

上门洗车APP --- Android客户端开发 之 网络框架封装(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 本篇接着给大家分享网络框架封装,相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解,这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 dataRequest 方法 和

【Android】自己写的轻量级安卓网络框架——能够控制网络连接,支持缓存

1原因: 之所以写这个框架是因为网上的好多的网络框架都没有很好的对网络连接进行控制,比如当你点击取消的时候只是对话框取消了,后台网络请求还是在继续,这样就造成了activity的无法释放,更严重的情况是降低APP流畅度,所以就结合自己的需求写了个这样轻量级的网络框架 2解决方案: 我已经开源了,放在了OSC上,框架目前还不是很完善,所以需要慢慢改善,不过这个流程目前感觉是非常不错的,当activity销毁的时候基本不会存在无法释放问题.当你点击取消的时候也不会出现后台网络请求还在继续的情况. h

Android笔记(六十二)网络框架volley

什么是Volley 很多时候,我们的APP都需要用到网络技术,使用HTTP协议来发送接收数据,谷歌推出了一个网络框架——volley,该框架适合进行数据量不大,但通信频繁的网络操作. 它的优点: (1)默认Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient: (2)符合Http 缓存语义 的缓存机制(提供了默认的磁盘和内存等缓存): (3)请求队列的优先级排序: (4)提供多样的取消机制: (5)提供简便的图片加载工具(其实图片的加载才是我们

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

上门洗车APP --- Android客户端开发 前言及业务简介 最近有些小累,私自接了一个项目,利用空余时间在开发,也比较乏力,时间和精力上有时候分配不过来,毕竟公司的事情要忙,只能自己抽时间来完成了,男人嘛,累点好,舒服是留给死人的(套用了一句逼格的话,o_O"~). 项目目前还在开发中,接口的调试以及业务的分析,框架的搭建,客户端这边已进行的差不多了,明天端午节,先祝大家节日快乐,汗~,看了下时间,貌似博客写完发表已经是端午节了,好吧,咕嘟咕嘟...... 大晚上的也是睡不着,写写博客,总

android 网络框架 源码分析

android 网络框架 源码分析 导语: 最近想开发一个协议分析工具,来监控android app 所有的网络操作行为, 由于android 开发分为Java层,和Native层, 对于Native层我们只要对linux下所有网络I/O接口进行拦截即可,对于java 层,笔者对android 网络框架不是很了解,所以这个工具开发之前,笔者需要对android 的网络框架进行一个简单的分析. 分析结论: 1. android 的网络框架都是基于Socket类实现的 2. java 层Socket