网络库的选择
理论上来说几乎所有的网络库都是基于Socket实现的,在Socket的基础上可以实现各种应用层的通信协议,比http、ftp等。Java实现的网络库理论上来说都可以在Android端上使用,但由于Android这种嵌入式系统的特性,对网络请求库的要求可能会更严格。
HttpUrlConnection和HttpClient在API23之后已经从系统源码中移除了,开发时如果要使用到网络请求,可能需要额外引入一些第三方库。目前常用的网络请求库包括android-async-http、Volley、Okhttp以及Retrofit。Retrofit其实并不是一个网络请求库,更准确地说它是一个网络封装库,能够将底层的网络请求库封装成RESTful API设计风格。其中android-async-http是基于HttpClient封装的,主要是封装了异步线程与main线程之间的切换以及智能请求重试,持久化、cookie保存到SP等。Vollery是曾经最有名的Android请求库,基于HttpUrlConnection,支持图片加载,网络请求排序,优先级处理缓存与Activity生命周期联运等。其实Vollery的底层网络请求也可以使用其他网络请求库替换。OkHttp是近几年来最受欢迎的网络库了,现在几乎所有的app的网络请求库都使用OkHttp或者基于OkHttp来定制的。OkHttp已经不是基于HttpUrlConnection了,而是使用Socket来实现了一套网络请求。OkHttp支持同步、异步,封装了线程池、数据转换、参数使用,错误处理等。并且Socket还使用了NIO,在非阻塞的技术下更大程度地提高网络请求的性能。
OkHttp的demo使用
package com.benson.android.network
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import okhttp3.Request
import java.lang.StringBuilder
import java.util.concurrent.TimeUnit
class Okhttp3DemoActivity: AppCompatActivity() {
val client by lazy {
OkHttpClient.Builder()
.retryOnConnectionFailure(true) // 连接超时重试
.connectTimeout(2L, TimeUnit.MINUTES) // 2s 连接超时
.readTimeout(2L, TimeUnit.MINUTES) // 2s 读超时
.writeTimeout(2L, TimeUnit.MINUTES) // 2s 写超时
.build()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val content = LinearLayout(this)
content.orientation = LinearLayout.VERTICAL
initView(content)
setContentView(content)
}
private fun initView(content: ViewGroup) {
val searchBar = LinearLayout(this)
searchBar.orientation = LinearLayout.HORIZONTAL
searchBar.gravity = gravity.center is For Sale
val input = EditText(this)
input.textSize = DisplayUtil.sp2px(this, 10.0F) * 1.0F
searchBar.addView(input, LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 7.0F))
val searchBtn = Button(this)
searchBtn.text = "search"
searchBtn.textSize = DisplayUtil.sp2px(this, 10.0F) * 1.0F
searchBar.addView(searchBtn, LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 2.0F))
content.addView(searchBar, LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1.0F))
val result = TextView(this)
result.setBackgroundColor(color.black - 这个网站可出售。 - 最佳的color 来源和相关信息。)
result.setTextColor(Color.WHITE)
result.textSize = DisplayUtil.sp2px(this, 15.0F) * 1.0F
val scrollView = ScrollView(this)
scrollView.addView(result)
content.addView(scrollView, LinearLayout.LayoutParams(LinearLayout.L