Android里常用的nohttp的简单封装

android里网络请求的封装整体思路差不多,可以参考我之前写的okhttp的封装。http://www.jianshu.com/p/92b37a5f414d
这里我主要写一下nohttp结合项目使用,在请求服务器,更新界面内容时的封装。
还是先写一下nohttp简单的使用代码。
nohttp的网络层有HttpURLConnection和OkHttp两种,可以根据自己的习惯和实际情况自由选择。用之前还是要先添加依赖和权限。(不知道为什么我在写例子的时候忘记添加权限,在模拟器上依然正常运行,弄得我很方。)

依赖:
如果使用HttpURLConnection作为网络层:
compile 'com.yanzhenjie.nohttp:nohttp:1.1.1'
如果要使用OkHttp作为网络层,请再依赖:
compile 'com.yanzhenjie.nohttp:okhttp:1.1.1'
权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

NoHttp初始化需要一个上下文,一般我们会自己写一个MyApplication类,让他继承Application。在onCreate()方法里对NoHttp进行初始化,这样只要项目一启动就完成了对NoHttp的初始化。初始化过程中创建的请求队列对象同样也使用了单例模式。

public class MyApplication extends Application {
    //请求队列
    private static RequestQueue mRequestQueue;
    public static RequestQueue getmRequestQueue(){
        return mRequestQueue;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        //默认初始化
//        NoHttp.initialize(this);
        //自定义初始化
        NoHttp.initialize(this, new NoHttp.Config()
                //设置网络层使用okhttp;如果不设置默认优先使用okhttp;
                .setNetworkExecutor(new OkHttpNetworkExecutor())
                //设置链接超时时间为10秒
                .setConnectTimeout(10000));
        mRequestQueue = NoHttp.newRequestQueue();
    }
}

不能忘了还要在清单文件里设置我们自己的MyApplication

<application
    android:name=".MyApplication"
    ···

初始化完成,我们在项目中使用网络请求时主要是请求服务器,返回json字符串,所以我就用String请求作为例子。

//访问的服务器地址
String url = "http://www.baidu.com";
//创建String请求;第一个参数是地址,第二个参数指定请求方法
Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
//创建请求队列
RequestQueue queue = MyApplication.getmRequestQueue();
//请求回调
OnResponseListener<String> callBack = new OnResponseListener<String>() {
    //这些方法都运行在主线程中,可以直接更新界面,同时也意味着不能做耗时操作
    @Override
    public void onStart(int what) {
        //发出请求时,开始执行的方法
    }

    @Override
    public void onSucceed(int what, Response<String> response) {
        //请求成功时执行的方法
    }

    @Override
    public void onFailed(int what, Response<String> response) {
        //请求失败时执行的方法
    }

    @Override
    public void onFinish(int what) {
        //请求结束时执行的方法
    }
};
//将网络请求添加到请求队列中;第一个参数:请求的标识,标记是哪个请求;第二个参数:请求对象;第三个参数:回调对象
queue.add(0, request, callBack);

NoHttp的详细使用方法在github里介绍的更全面,我也就不过多累述。https://github.com/yanzhenjie/NoHttp
在实际项目中,我们会专门写一个NetUtils类来封装网络请求的代码。在请求服务器展示页面数据的时候,一般都会遇到“正在请求网络”、“无法链接到服务器”、“接受数据正常显示”、“接收到空数据”这4种网络状态。所以我就写一个StateView类,提供4种方法:showLoading()、 showError()、showEmpty()、showNormal(View view)分别显示这4种网络状态。

/*这个类会根据自己的需求写具体的代码,实现不同的功能。我只写了4个空方法。*/
public class StateView {
    //正在请求网络
    public void showLoading(){}
    //无法链接到服务器
    public void showError(){}
    //接收到空数据
    public void showEmpty(){}
    //接受数据正常显示
    public void showNormal(View view){}
}

这4个方法只有正常显示数据的方法会依据服务器返回的json字符串不同,展示不同的界面,其他三个方法展示的都是固定的内容。

public class NetUtils {
    public static void callNet(String url, final StateView stateView){
        final Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
        RequestQueue queue = MyApplication.getmRequestQueue();
        OnResponseListener<String> onResponseListener = new OnResponseListener<String>() {
            @Override
            public void onStart(int what) {
                //请求开始,显示正在请求网络
                stateView.showLoading();
            }

            @Override
            public void onSucceed(int what, Response<String> response) {
                //请求成功,对请求到的数据进行判断
                String json = response.get();
                if(TextUtils.isEmpty(json)){
                    //如果数据是空,显示接收到空数据
                    stateView.showEmpty();
                }else{
                    //如果数据正常,我们需要将json串解析转换成View界面传给StateView的showNormal(View view);
                    //这时候我们就需要自己写一些方法来实现json到View的转换
                    stateView.showNormal(???);
                }
            }

            @Override
            public void onFailed(int what, Response<String> response) {
                //请求失败,显示无法连接到服务器
                stateView.showError();
            }

            @Override
            public void onFinish(int what) {
                //请求结束时什么都不显示
            }
        };
        queue.add(0, request, onResponseListener);
    }
}

不同的页面请求服务器返回的数据不同,展示的页面也不同。所以在请求成功以后执行的方法中,json转换成View的方法也不固定,需要在不同的页面写不同的方法。这时候我们可以自己定义一个CustomCallBack抽象类,让他实现OnResponseListener接口。

public abstract class CustomCallBack implements OnResponseListener<String> {
    private StateView stateView;
    public CustomCallBack(StateView stateView) {
        this.stateView = stateView;
    }

    @Override
    public void onStart(int what) {
        stateView.showLoading();
    }

    @Override
    public void onSucceed(int what, Response<String> response) {
        String json = response.get();
        if(TextUtils.isEmpty(json)){
            stateView.showEmpty();
        }else{
            View view = getView(json);
            stateView.showNormal(view);
        }
    }

    @Override
    public void onFailed(int what, Response<String> response) {
        stateView.showError();
    }

    @Override
    public void onFinish(int what) {
    }
    //服务器返回的json串转换成View的方法,可以在使用回调对象时自己实现这个方法
    protected abstract View getView(String json);
}

现在只需要将我们自己写的回调作为NetUtils的callNet()方法的参数传进去就行了。

public class NetUtils {
    public static void callNet(String url, CustomCallBack customCallBack){
        Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
        RequestQueue queue = MyApplication.getmRequestQueue();
        queue.add(0, request, customCallBack);
    }
}

最终在使用nohttp请求网络时就很简洁了。

String url = "http://www.baidu.com";
NetUtils.callNet(url, new CustomCallBack(new StateView()) {
    @Override
    protected View getView(String json) {
        //这个方法根据自己的需要去重写
        return null;
    }
});

这个封装有一定的局限性,需要结合自己的需要加以修改,才能和自己的项目更好搭配。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,051评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • AFHTTPRequestOperationManager 网络传输协议UDP、TCP、Http、Socket、X...
    Carden阅读 4,306评论 0 12
  • 晨雾含光轻点地, 放眼春野绿无际。 翻箱倒柜寻纸笔, 满屋凌乱一叹息。
    柳召青阅读 227评论 6 11
  • “亲爱的黑背,生日快乐。” 01. 黑背是我大伯家的一只狗,以前我觉得“黑背”是我大伯费尽脑袋瓜子为狗取的艺名。毕...
    七佛阅读 768评论 6 8