前不久,对一个Eclipse下开之Android应用进行重构,原先用的网络框架是AsyncHttpClient。众所周知,HttpClient已经当Android
6.0中都给官方remove了。官方推荐我们用的
HttpURLConnection。当然要您就是要不得已要为此其,可以由此在build.gradle中投入下面的代码获取。

常年漂泊在外,所呈现底山水更是多,对家乡的记得越来越不景气,但是有把味道也永远没法忘记,偶尔想起来或会不鸣金收兵的咽口水。又至同一年端午节,总免不了吃粽子,但是本人是一个最为不爱吃粽子的总人口,而以自家的家乡端午吃粽子的风气极其深刻,在农村粽子往往成为端午节后一个月各家用于找到客人和街坊邻里用于互动问好的赠礼。家家户户泡上一壶热茶或者油茶,然后重新比如便炒几独菜或者略的就直由坛子里取出一碗腌制好之大头菜或者萝卜干啊的,这写组成了彼此宴请的街坊邻居最好之食材。虽说是请客,实际上最简单,没有大鱼大肉,但是农村人或多或少呢无马虎,像端午节这样的传统节日,你只要想请求您的左邻右舍到你家来喝杯热茶,那粽子一定是使管够的,同时大家对菜也未会见发生求,有平等锅好的油漆茶水,再长浓郁之“稻灰粽”就够用了。

android {    
    useLibrary 'org.apache.http.legacy'
}

端午吃粽子,这谁都了解。但说及“稻灰粽”,许多总人口知晓之,不知其二。据招,“稻灰粽”算得达中国先之一模一样特别说明创造,西晋周处(240—299)所创作《风土记》中即使生“用菰叶裹黍米,以纯浓灰汁煮之,令烂熟”的记载。古人将“灰汤”中所蕴含的碳酸钾巧妙地改为了粽子的发色剂、赋香剂、品质改良剂、防腐剂和营养强化剂,是针对性食品科学的等同要命奉献。吃罢稻灰粽的人数还见面被那非常之气味所诱惑:“香香的白糯米,用稻杆的灰水浸泡后包成粽子,变成了嫩黄嫩黄的,飘在莫名的香。不需加蜜枣,也非需用鲜肉,只是立刻原味的粽子,蘸着雪雪白之白糖,咬上同人,那种芬芳甜蜜是如果融入人的血缘,刻进人的魂魄里之。”在我之热土,哪里的口不但端午节吃粽子,就连中秋节粽子也是各家餐桌上必备的佳肴,直到现在我还“酒入雄黄粽子裹,要品尝滋味到端阳。”端午吃谷类灰粽,成为自我本着邻里最好有味道的记得有。

话题走偏了。。。我是吧坑的。

在端午节前夕,往往也是杨梅成熟的时令。我对杨梅的记忆从生便开了,在相距村几里多之同一坐山上,种满了梅毒,大的估量得发成年人的合抱那么大,小的也罢得生只几十年之大约了。杨梅的品质良莠不齐,有的酸得掉牙,有的甜如蜜;有白之,有黑色的,大的诸如鸟蛋,小之如黄豆,其中白色和黑色的最为好吃,而且鲜的水平以及她俩白或者黑的水准成正比,最无好吃的就是那种红色的,光鲜亮丽,一口下来,正如我面前所说的可以酸掉你的门牙。而自我异常时段吃杨梅有几乎独嗜好好,第一:我爱不释手吃酸的,说是喜欢,其实是无可奈何的挑三拣四,因为那些杨梅树大多数还早就进来老年,结出来的硕果大多人一般,再者,那漫山遍野的杨梅完全处于自然生长状态,只发到了历年收成的时候才见面有人去管树枝能够覆盖的限量外的地上的草割了,然后铺以地上,防止丢失下的杨梅砸坏了。吃杨梅的周期异常短缺,可能就是是一个礼拜就从不了,往往一阵大雨或大风就会将树上的备果子能让您少根了。

回调方法不见面活动到主线程中运作

虽设达到同一首OkHttp学习系列一样:入门与精炼用所说的,OkHttp的统筹是适合Java和Android程序的,但未是专门为Android应用设计。所以关于Android中之有数独规范,它是免体贴的。哪点儿个也?

  1. 无能够在主线程(UI主线程)发起网络;
  2. UI操作应该当UI线程中实施;

查看OkHttp3的源码发现:使用enqueue方法开展网络访问时,OkHttp会在线程池中调用异步任务拓展网络访问同回调,所以极1是满足的。但是下的代码还是有题目,报了充分:CalledFromWrongThreadException。为什么?

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://lshare.me").build();
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Toast.makeText(TroubleDetailActivity.this,"Success",Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onFailure(Call call, IOException e) {
    }
});

因为Toast涉及UI,必须于UI线程中执,而OkHttp不见面自行到主线程遭遇实行回调方法的,违反原则2。so,下面才是毋庸置疑姿势。

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://lshare.me").build();
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        runOnUiThread(new Runnable() {//这是Activity的方法,会在主线程执行任务
            @Override
            public void run() {
                Toast.makeText(TroubleDetailActivity.this, "Success", Toast.LENGTH_SHORT).show();
            }
        });
    }
    @Override
    public void onFailure(Call call, IOException e) {
    }
});

对杨梅的记还不仅仅是他让本人带来的味觉上之回想,还有本人那么一切荒废的小儿,和小伙伴等荒废在田间地头的孩提。记得特别时刻杨梅于咱们那一带就算不达标奇特,但是方元几只一直也便惟有我们那有。一到了杨梅成熟的时令,小偷或者说强盗啊一连出没于隔壁的宗。有时候因为偷杨梅有的打架斗殴也是从来的从业。所以,我们这些多少屁孩就改成了了童子军或者通信兵,一放学就赶赴各个流派,或者当以路边阴凉处远远的羁押在,或者直接躺在树上,边放哨边吃。那逍遥与轻松,如果苏东坡在于是年份估计为就算只好吟出:“日啖杨梅三百颗,不辞宁做岭南人口”了咔嚓。然而日啖杨梅三百颗对己来说简直弱爆了,连我好还不晓得就消化能力怎么老大,而且自吃杨梅的亚独嗜好好就是是并核都未会见剩下,直接一百般发一充分丸的通往肚子里吞。

尚未帮我缓存并发送Cookie给服务器

应用方面的代码访问网络,会发现自早就于登录页面签到成功了,然而在通向服务器请求数据常常,服务器告诉我:你这家伙还没登录啊。我醉了,明明登录成功了。仔细一想,会不见面Cookie没有拉动过去,服务器可是光认Cookie不认人的,虽然自己要有那点帅。用Fiddle办案包一收押,吓死本宝宝了,果然没有发送过去。于是,赶紧Google了一下,看到网上说的:

  1. OkHttp
    3.0开头,默认不保留Cookie,要和谐运CookieJar来保存Cookie。我于是之哪怕是3.0,命中。
  2. 运Builder来构建OkHttpClient才会装CookieJar。我是一直new的,命中;
  3. 使下的代码可以帮忙您活动管理Cookie。下面的代码摘自OkHttp3之Cookies管理与持久化

OkHttpClient client = new OkHttpClient.Builder()
    .cookieJar(new CookieJar() {
        private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            cookieStore.put(url.host(), cookies);
        }
        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            List<Cookie> cookies = cookieStore.get(url.host());
            return cookies != null ? cookies : new ArrayList<Cookie>();
        }
    })
    .build();

第3独说法就闹题目了,首先这cookieStore的key究竟是HttpUrl呢,还是String。因为代码中,创建时使用HttpUrl,而get和put时却是传入url.host()`,而当时是单String,不正确!博主走心了。

品味下,使用HttpUrl作为key,修改put和get,传入url,用fiddler抓包,发现题目还是。又因故了String作为key,修改cookieStore的概念,改key为String,用fiddler再次尝试了生。好感动,居然成啦!

//记录下正确姿势
OkHttpClient mHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
    private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
    //Tip:這裡key必須是String
    @Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
        cookieStore.put(url.host(), cookies);
    }
    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
        List<Cookie> cookies = cookieStore.get(url.host());
        return cookies != null ? cookies : new ArrayList<Cookie>();
    }
}).build();

为什么?

为何不能够为此HttpUrl?看起代码似乎并未呀不妥啊

在押下HttpUrl的源代码,官方给本人者案例。说明了一个HttpUrl由scheme、host、pathSegment、queryParameter四部分组成。

HttpUrl url = new HttpUrl.Builder()
      .scheme("https")
      .host("www.google.com")
       .addPathSegment("search")
      .addQueryParameter("q", "polar bears")
      .build();

眼看不殊醒目也?我们在报到页面发送的url和得主页面数据时恳求的url是殊的。我们应用前一样蹩脚的url保存cookie在hashMap中,在求主页面数据时OkHttp用新的url从hashMap取不至cookie,所以服务器不服气你了,以为你从未登录。而url.host()是每次都同一的,这是要!


履新日志:

  • 3月26日:感谢@_挥霍
    对本文的更正。