LiteHttp 第一节:初始化和初步使用


本系列文章面向android开发者,展示开源网络通信框架LiteHttp的主要用法,并讲解其关键功能的运作原理,同时传达了一些框架作者在日常开发中的一些最佳实践和经验。

本系列文章目录总览: http://blog.csdn.net/ko33600/article/details/49367409


1. 初始化及单例

初始化LiteHttp需要传入一个HttpConfig的实例来配置各项参数,若传入null即表示使用全部使用默认设置。

需要注意的是,一个App仅需要构建一个LiteHttp的实例即可,即单例模式,这样才能最节省系统资源,多个实例并不提升效率反而浪费资源。

使用默认配置,不是我良辰不给你,你不是很屌吗,自力更生吧:

LiteHttp liteHttp = LiteHttp.newApacheHttpClient(null);

更推荐简单的自定义配置:

HttpConfig config = new HttpConfig(activity) // configuration quickly
        .setDebugged(true)                   // log output when debugged
        .setDetectNetwork(true)              // detect network before connect
        .setDoStatistics(true)               // statistics of time and traffic
        .setUserAgent("Mozilla/5.0 (...)")   // set custom User-Agent
        .setTimeOut(10000, 10000);             // connect and socket timeout: 10s
liteHttp = LiteHttp.newApacheHttpClient(config);

这个案例示范了context(用于网络状态判断),打开调试,探测网络状态,开启数据统计,User-Agent,以及连接和读取超时等参数的配置。
更多的配置项有达23+项之多,比较灵活,后边会有专门章节详细说明。

下面讲解如何发起请求,我们首先定义合法的http地址,如:

String url = "http://baidu.com";
String picUrl = "http://pic.33.la/20140403sj/1638.jpg";

2. 发起同步请求

撸一行代码即可,节省的时间爷沏一杯菊花茶:

String html = liteHttp.perform(new StringRequest(url));

构建一个请求,通过litehttp执行获取结果,当然无需回调,直截了当。

再撸一行,获取一张美图:

Bitmap bitmap = liteHttp.perform(new BitmapRequest(picUrl));

注意:同步请求在当前线程直接执行,应用需开启子线程执行。

3. 发送异步请求

异步请求获取String:

liteHttp.executeAsync(new StringRequest(url));

异步获取原始byte:

liteHttp.executeAsync(new BytesRequest(url));

异步加载一张位图:

String saveToPath = "/sdcard/a.png";

liteHttp.executeAsync(new BitmapRequest(url,saveToPath));

saveToPath用来输入一个你指定的文件位置,位图将会保存到这里,传入null则保存默认位置。

异步下载一个文件:

liteHttp.executeAsync(new FileRequest(url,saveToPath));

saveToPath 用来输入一个你指定的文件位置,文件将会保存到这里,传入null则保存缓存默认位置。

文件默认存储位置和命名规则:
- 统一存放到 HttpConfig 设置指定的文件夹中。
- 请求已设置 Cache-Key,则取其为文件名字。
- 请求未设置 Cache-Key,则通过处理 Url 自动生成文件名字。

我们知道了怎么发起异步请求,那么请求是成功还是失败,成功如何获取结果,失败如何获取异常?

4. UI线程 监听和处理响应

同步 获取 String,在 UI线程 处理结果或异常:

// 主线程处理,注意HttpListener默认是在主线程回调
// get data in listener,  handle result on UI thread
liteHttp.execute(new StringRequest(url).setHttpListener(
        new HttpListener<String>() {
            @Override
            public void onSuccess(String data, Response<String> response) {
                response.printInfo();
            }
        }
));

异步 下载 File,在 UI线程 监听进度:

liteHttp.executeAsync(new FileRequest(url,saveToPath).setHttpListener(
    new HttpListener<File>(true, true, true) {

        @Override
        public void onLoading(AbstractRequest<Bitmap> request, long total, long len) {
            // 进度通知
        }

    })
);

5. 当前线程 监听和处理响应

同步 加载位图,在 当前线程 监听HttpListener构造函数第一个参数设置为false即可;第二、三个参数设置为true开启上传、下载进度监听:

// 2.2 return data directly, and handle result on current thread(当前主线程处理)
Bitmap bitmap = liteHttp.perform(new BitmapRequest(picUrl)
        .setHttpListener(new HttpListener<Bitmap>(false, true, true) {

            @Override
            public void onLoading(AbstractRequest<Bitmap> request, long total, long len) {
                // down loading notification ...
            }

            @Override
            public void onUploading(AbstractRequest<Bitmap> request, long total, long len) {
                // up loading notification...
            }
        }));

异步 获取 String,在 当前线程 处理结果,HttpListener构造函数参数设置为false即可:

liteHttp.executeAsync(new StringRequest(url)
        .setHttpListener(new HttpListener<String>(false) {
            @Override
            public void onSuccess(String s, Response<String> response) {
                // 成功:主线程回调,反馈一个string
                response.printInfo();
            }

            @Override
            public void onFailure(HttpException e, Response<String> response) {
                // 失败:主线程回调,反馈异常
                response.printInfo();
            }
        })
);

其他模式的请求用法一样,这里不再多举。

6. 推荐通过注解完成请求

请求默认是GET方式,假设完成一个登陆操作,API和参数为http://xxx?name=lucy&password=123456,登陆成功返回User对象,我们有以下接口:

public String loginUrl = "http://litesuits.com/mockdata/user_get";

该接口的响应体是个Json字符串:

{
    "api": "com.xx.get.userinfo",
    "v": "1.0",
    "result": {
        "code": 200,
        "message": "success"
    },
    "data": {
        "age": 18,
        "name": "qingtianzhu",
        "girl_friends": [
            "xiaoli",
            "fengjie",
            "lucy"
        ]
    }
}

根据该Json响应,对应的 User 类如下:

public class User {
    private String api;
    private String v;
    protected int code;
    protected String message;
    protected Data data;

    public static class Data {
        public int age;
        public String name;
        public ArrayList<String> girl_friends;
    }
}

通过注解约定的方式配置代码如下,更清晰:


// 1.1 地址:loginUrl
// 1.2 参数:name=value&password= value
// 1.3 响应:成功返回 User 对象
@HttpUri(loginUrl)
class LoginParam extends HttpRichParamModel<User> {
    private String name;
    private String password;

    public LoginParam(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

// 2. 一句话调用即实现登陆和监听
liteHttp.executeAsync(new LoginParam("lucy", "123456").setHttpListener(
        new HttpListener<User>() {
            @Override
            public void onSuccess(User user, Response<User> response) {
                HttpUtil.showTips(activity, "对象自动转化", user.toString());
            }
        }
));

LoginParam 一个类定义了 API地址、参数、响应体 三个关键数据定义,非常的清晰简单。

7. 请求监听器HttpListener简介

HttpListener各个回调的时机有:开始、成功、失败、取消、重试、上传进度、下载进度、结束。

值得注意的是 HttpListener 有多个参数(构造函数和使用set方法均可)可以设置:

HttpListener(boolean runOnUiThread, boolean readingNotify, boolean uploadingNotify)

分别用于设置:

  • 所有回调是否在主线程
  • 是否开启下载进度通知
  • 是否开启上传进度通知

一般情况下:

  • 开始和结束作为开闭节点一定会被调用
  • 成功、失败、取消三个作为结果将有一个被调用
  • 默认主线程回调,setRunOnUiThread设置为false将在本线程回调,性能更高,但不可操作UI。
  • 下载进度通知仅在setReadingNotify设置为true时触发调用
  • 上传进度通知仅在setUploadingNotify设置为true时触发调用
  • 通过setLinkedListener来设置一个级联的监听器
  • 通过setDelayMillis来设置 所有 回调方法的延时,以方便调试
  • 复写disableListener来动态设置禁用回调,返回true则 所有 的回调都被禁用。

其他更多最佳实践方式在请关注另外分析文章。

8. 本章总结

  • 监听器 HttpListener 很强大,不论同步还是异步请求都可灵活运用。
  • 同步请求方式之 perform:返回明确类型的data数据,直接简单。
  • 同步请求方式之 execute:返回完整响应体response,包含header,status,data等各种数据。
  • 异步请求方式之 performAsync:返回可取消任务FutureTask。
  • 异步请求方式之 executeAsync:无返回,调用request的cancel方法取消。
  • 异步方法以Async结尾,非安全同步请求以OrThrow结尾,很容易分辨和调用。
  • 和普通同步请求的区别是 非安全同步请求 是将异常直接抛出,由开发者自己捕获异常。
  • 普通方法是安全的,异常可通过监听器onFailure()捕获,或者response.getException()获取。
  • 另外Response对象很重要,几乎拥有一切关于请求的数据,可调用response.printInfo()来打印所有请求相关的信息以便调试。
  • 注解很方便,层次和配置更清晰,推荐在实践中使用。

官网: http://litesuits.com

QQ群: 大群 47357508二群 42960650


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第1关的任务是初始化SparkContext。SparkContext是Spark的核心组件之一,它是连接Spark集群和应用程序的桥梁。在初始化SparkContext时,需要指定一些参数,如应用程序名称、master节点地址等。通过初始化SparkContext,我们可以创建RDD、DataFrame等Spark数据结构,进行数据处理和分析。 ### 回答2: SparkContext初始化是Spark框架用于启动应用程序的关键步骤之一。SparkContext(SPC)是一个对象,用于协调Spark应用程序并与集群进行交互。在创建SparkContext之前,需要先创建一个Spark配置,该配置包含了与集群通信所需的信息。 SparkContext初始化主要包含以下步骤: 1. 创建Spark配置:通过SparkConf对象创建Spark配置。SparkConf对象包含了Spark应用程序的配置信息,例如Executor数量、内存大小、日志配置和应用程序名称等。 2. 创建SparkContext对象:在创建SparkContext对象之前,需要先创建一个SparkConf对象,该对象将作为参数传递给SparkContext构造函数。在SparkContext创建期间,它将使用SparkConf来配置集群中的执行器。SparkContext对象是整个Spark应用程序的核心对象,它是连接驱动程序与各个执行器之间的纽带。 3. 初始化Spark插件:Spark插件是一组可选组件,用于操纵Spark核心代码的执行过程。例如,在调优Spark应用程序时,我们可以使用Spark插件提供的信息以及访问执行计划和RDD的信息。Spark插件的创建及初始化初始化SparkContext时会完成。 4. 初始化元数据:在开始执行任何Spark代码之前,需要对数据源进行元数据扫描。例如,如果我们使用Hive作为数据源,则需要对Hive元数据进行扫描以查找可用的表和列。Spark元数据初始化过程在初始化SparkContext时进行。 在进行SparkContext初始化后,我们可以使用SparkContext对象访问各种Spark功能,例如Spark SQL、Spark Streaming和MLlib等。SparkContext对于驱动程序而言是一个中央位置,它控制着整个应用程序的进程和资源。SparkContext的创建可能会花费一些时间,但这是一个必要的步骤,因为SparkContext初始化过程中会启动与集群的通信。因此,在Spark应用程序中选择适当的配置和优化SparkContext对象的创建非常重要。 ### 回答3: SparkContext是Spark安装包中最重要的类,也是驱动程序与集群通信的入口。在Spark应用程序中,首先要创建一个SparkContext对象,才能进行后续的操作。 SparkContext对象的初始化通常包括以下几个步骤: 1.导入所需的Spark库 首先需要在代码的开头导入所需的Spark库,以便能够使用SparkContext类。一般来说,需要导入pyspark库或者Scala中的Spark库。 2.创建SparkConf对象 SparkConf是一个设置Spark应用程序参数的容器。在创建SparkContext对象时,需要先创建一个SparkConf对象,用来设置一些参数,如应用程序名称、Master URL、序列化类等。 3.创建SparkContext对象 在创建SparkContext对象时,需要指定上述设置好的SparkConf对象参数。同时,需要指定应用程序名字、Master URL等参数。创建SparkContext对象会向集群申请资源,并将应用程序打包并发送到集群中。 4.使用SparkContext对象进行操作 初始化完成后,可以使用SparkContext对象进行后续的操作,包括读取数据、进行数据处理等。 总之,SparkContext对象的初始化是Spark应用程序的第一步,它是整个Spark应用的核心。只有在正确理解和使用SparkContext对象的前提下,才能开发出高效、稳定、可扩展的Spark应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值