Android网络连接判断与检测
1.GET请求
private fun httpGetDemo() {
//1.请求参数
val url = httpHost + "/api/test?arg1=xxx"
//2.构造 OkHttpClient : 设置连接超时、读取超时、写出超时、cookie等
var okhttp3 = OkHttpClient.Builder()
.retryOnConnectionFailure(true) //失败重连
.connectTimeout(connectTimeout, TimeUnit.SECONDS) //设置连接超时时间
.readTimeout(readTimeout, TimeUnit.SECONDS) //设置读取超时时间
.writeTimeout(writeTimeout,TimeUnit.SECONDS) //设置写出超时时间
.cookieJar(cookieJar) //设置cookie
.build()
//3.构造 Request ,设置请求方法,请求头参数
var rb = Request.Builder()
.url(url) //指定请求地址
.get() //指定请求的方法
//设置header的3种方法:
//a, 添加 key - value
rb.addHeader("header1","value1") //添加自定义的header1
rb.addHeader("header2","value2") //添加自定义的header2
//b, 按key修改value
rb.header("Cookie","df") //指定某个header的值
//c,完全替换headers,注意它会把Request.Builder里设置的都删除,然后按自己添加的key-value重新设置当前builder的headers
var hb = Headers.Builder()
hb.add("header1","value1")
hb.add("header2","value2")
var headers = hb.build()
rb.headers(headers) //指定headers
var request = rb.build()
//4.发起请求
okhttp3.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
//5.处理请求失败
Log.e("DailyFrgmt","rollOverData onFailure error = " + e.message)
activity?.runOnUiThread {
Toast.makeText(getContext(),"查询翻身数据失败",Toast.LENGTH_SHORT).show()
}
}
override fun onResponse(call: Call, response: Response) {
//6.请求成功
var json = ""
//6.1 从response里可取得cookie
var url = request.url
var headers = response.headers
var cookies = Cookie.parseAll(url,headers)
for (cookie in cookies){
Log.e("Cookies ", "cookie : name = " + cookie.name + " value = " + cookie.value)
}
//6.2 得到2进制流,一般下载用,保存成文件。
var stream = response.body?.byteStream()
var br = BufferedInputStream(stream)
var len =
var buf = ByteArray( * )
do {
len = br.read(buf)
if (len > ){
json += String(buf,,len)
}
}while (len != -)
Log.e("DailyFrgmt","rollOverData onResponse = " + json)
if (LogUtil.TO_FILE){
try {
var js = context?.getExternalFilesDir("")?.absolutePath.toString() + "/rollover.json"
var fw = FileWriter(js)
fw.write(json)
fw.close()
}catch (e : java.lang.Exception){
e.printStackTrace()
Log.e("DailyFrgmt","exception = " + e.message)
}
}
//7.业务方法
}
})
}
2.POST请求
fun login( uname : String,pwd : String,failed : (reason : String?) -> Unit,succeed : () -> Unit){
val url = httpHost + "/api/login/"
//1.构造post的json
var jsObj = JSONObject()
jsObj.put("userName",uname)
jsObj.put("password", Encrypt.md5(pwd))
var body = RequestBody.create("application/json; charset=utf-8".toMediaType(), jsObj.toString())
//2.构造 OkHttpClient
var okhttp3 = OkHttpClient.Builder()
.retryOnConnectionFailure(true) //失败重连
.connectTimeout(connectTimeout, TimeUnit.SECONDS) //设置连接超时时间
.readTimeout(readTimeout, TimeUnit.SECONDS) //设置读取超时时间
.writeTimeout(writeTimeout,TimeUnit.SECONDS)
.cookieJar(cookieJar) //设置cookie
.build()
//3.构造post请求
var rb = Request.Builder()
.url(url)
.post(body)
//设置header的3种方法:
//a, 添加 key - value
rb.addHeader("header1","value1") //添加自定义的header1
rb.addHeader("header2","value2") //添加自定义的header2
//b, 按key修改value
rb.header("Cookie","df") //指定某个header的值
//c,完全替换headers,注意它会把Request.Builder里设置的都删除,然后按自己添加的key-value重新设置当前builder的headers
var hb = Headers.Builder()
hb.add("header1","value1")
hb.add("header2","value2")
var headers = hb.build()
rb.headers(headers) //指定headers
var request = rb.build()
//4.发送请求
okhttp3.newCall(request).enqueue(object : Callback{
override fun onFailure(call: Call, e: IOException) {
//5.处理失败
Log.e("Login","error = " + e.message)
failed("请求失败")
}
override fun onResponse(call: Call, response: Response) {
//6.请求成功
var json = ""
//6.1 从response里可取得cookie
var url = request.url
var headers = response.headers
var cookies = Cookie.parseAll(url,headers)
for (cookie in cookies){
Log.e("Cookies ", "cookie : name = " + cookie.name + " value = " + cookie.value)
}
//6.2 得到2进制流,一般下载用,保存成文件。
var stream = response.body?.byteStream()
var br = BufferedInputStream(stream)
var len =
var buf = ByteArray( * )
do {
len = br.read(buf)
if (len > ){
json += String(buf,,len)
}
}while (len != -)
//7.业务方法
onSomeFunction(json)
}
})
}
3.关于Cookie
3.1 解析cookie
//4.发送请求
okhttp3.newCall(request).enqueue(object : Callback{
override fun onFailure(call: Call, e: IOException) {
//5.处理失败
Log.e("Login","error = " + e.message)
failed("请求失败")
}
override fun onResponse(call: Call, response: Response) {
//6.请求成功
var json = ""
//6.1 从response里可取得cookie
var url = request.url
var headers = response.headers
var cookies = Cookie.parseAll(url,headers)
for (cookie in cookies){
Log.e("Cookies ", "cookie : name = " + cookie.name + " value = " + cookie.value)
}
...
}
})
3.2 使用CookieJar操作cookie(保存、上报、共享)
var cm = HashMap<String,List<Cookie> >()
var cookieJar = object : CookieJar{
override fun loadForRequest(url: HttpUrl): List<Cookie> {
var cookies = java.util.ArrayList<Cookie>()
var cks = cm.get(url.host)
if (cks != null){
cookies.addAll(cks)
}
for(cookie in cookies){
Log.i("cookieJar","loadForRequest cookie = ${cookie}")
}
return cookies
} override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
cm.put(url.host,cookies)
}
} private fun testCookie() {
//1.请求参数
val url = httpHost + "/api/test?arg1=xxx" //2.构造 OkHttpClient : 设置连接超时、读取超时、写出超时、cookie等
var okhttp3 = OkHttpClient.Builder()
.retryOnConnectionFailure(true) //失败重连
.connectTimeout(connectTimeout, TimeUnit.SECONDS) //设置连接超时时间
.readTimeout(readTimeout, TimeUnit.SECONDS) //设置读取超时时间
.writeTimeout(writeTimeout,TimeUnit.SECONDS) //设置写出超时时间
.cookieJar(cookieJar) //设置cookie处理对象
.build() ...
}
- loadForRequest 是请求时加载本地cookie 的调用
- saveFromResponse 是保存cookie时的调用
- 每个 OkHttpClient 可以指定一个 cookie处理对象,一般一个url可返回一个cookie,同一个主机所有子url可以使用相同的CookieJar对象。
Android网络连接判断与检测的更多相关文章
- Android 网络连接判断与处理
Android网络连接判断与处理 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="and ...
- android 网络连接判断
Android 网络判断类,用来判断网络状态 使用方法: (1)先初始化 //初始化网络状态检测类 NetworkStateManager.instance().init(this); (2)判断是否 ...
- Android网络连接判断与处理
博客分类: Android 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android ...
- Android网络类型判断(2g、3g、wifi)
判断网络类型是wifi,还是3G,还是2G网络,对不同 的网络进行不同的处理,现将判断方法整理给大家,以供参考 说明:下面用到的数据移动2G,联通2G,联通3G,wifi我都已经测试过,暂时手上 ...
- 怎样检查Android网络连接状态
在发送任何HTTP请求前最好检查下网络连接状态,这样可以避免异常.这个教程将会介绍怎样在你的应用中检测网络连接状态. 创建新的项目 1.在Eclipse IDE中创建一个新的项目并把填入必须的信息. ...
- WebView 的使用----android 网络连接处理分析
在Android中,可以有多种方式来实现网络编程: 创建URL,并使用URLConnection/HttpURLConnection 使用HttpClient 使用WebView 创建URL,并使用U ...
- Android 网络连接状态的监控
有些应用需要连接网络,例如更新后台服务,刷新数据等,最通常的做法是定期联网,直接使用网上资源.缓存数据或执行一个下载任务来更新数据. 但是如果终端设备没有连接网络,或者网速较慢,就没必要执行这些任务. ...
- Android网络连接监听
接收系统网络服务的广播接收者 public class NetStateReceiver extends BroadcastReceiver { private Handler handler; pu ...
- Android网络连接之HttpURLConnection和HttpClient
1.概念 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.在 JDK 的 java.net 包中 ...
随机推荐
- iOS iOS8中 问题"registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later" 解决方式
问题重述: iOS 8中改变了通知注冊的方式,假设App须要同一时候支持iOS 7 和 8 的话,须要首先检查selector. 解决方式:在Xcode 6中 - (BOOL)application: ...
- js中字符串的拼接的另一种方法
// 按一定长度截断字符串,并使用 + 运算符进行连接. // 分隔字符串尽量按语义进行,如不要在一个完整的名词中间断开. // 特别的,对于HTML片段的拼接,通过缩进,保持和HTML相同的结构. ...
- WebService(2)-XML系列之用Stax操作Xml
源代码下载:链接: http://pan.baidu.com/s/1ntL1a7R password: rwp1 本文主要讲述:利用Stax处理xml文档 一.读取xml 1.基于光标的查找 核心:X ...
- 项目已经部署,tomcat已经启动,网址也没问题,却出现404错误
这个有可能是tomcat在初始化资源的时候发生了异常...判断tomcat是否发生异常就是看tomcat启动日志里有没有报错就行了. 另一种原因就是可能是修改了项目名称.因为web名称实际上是没有跟着 ...
- Java - split()函数和trim()函数的使用方法
split()函数和trim()函数的使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24465141 详细參考Java ...
- 那条linq语句为啥这么慢
目前所在的项目大量使用了linq,结果有个地方出现了严重的性能问题.一个统计需要3.40秒.头头焦头烂额之际,也让我看看. 我向来喜欢性能调优,自诩编码极为注重性能.曾几何时,也动不动就把性能挂在嘴边 ...
- java 内存简介
java程序对内存分配的方式一般有三种: (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量. (2) 在栈上创建. 在执行函数时,函数内局 ...
- UVA315 Network —— 割点
题目链接:https://vjudge.net/problem/UVA-315 A Telephone Line Company (TLC) is establishing a new telepho ...
- YTU 1004: 1、2、3、4、5...
1004: 1.2.3.4.5... 时间限制: 1000 Sec 内存限制: 64 MB 提交: 1275 解决: 343 题目描述 浙江工商大学校园里绿树成荫,环境非常舒适,因此也引来一批动物 ...
- 如何完成dedecms外部数据库调用|跨数据库数据调用
第1步:打开网站include\taglib文件夹中找到sql.lib.php文件,并直接复制一些此文件出来,并把复制出来的这个文件重命名为mysql.lib.php. 注:mysql.lib.php ...