本文共 4874 字,大约阅读时间需要 16 分钟。
在Android项目中引入OkHttp库,是实现网络请求的重要前提。这一步可以通过以下方式完成:
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
private void useAsynGet() { val okHttpClient = OkHttpClient() val url = "http://www.qq.com" val request = Request.Builder().url(url).get().build() val call = okHttpClient.newCall(request) call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { Log.e("useAsynGet", e.toString()) } override fun onResponse(call: Call, response: okhttp3.Response): Unit { val content = response.body().string() Log.e("useAsynGet", content) // 在子线程处理,通过Handler发送消息到主线程 val message = Message() message.what = MSG_WEB_CONTENT message.obj = content handler.sendMessage(message) } })}
private void useSyncGet() { val okHttpClient = OkHttpClient() val url = "http://www.qq.com" val request = Request.Builder().url(url).get().build() val call = okHttpClient.newCall(request) Thread { try { val response = call.execute() val content = response.body().string() Log.e("useSyncGet", content) } catch (e: IOException) { e.printStackTrace() } }.start()}
为了确保UI更新在主线程 انجام.Foundation历 dequeueReusableCellWithIdentifier(“MSG_WEB_CONTENT”) 来处理消息。
private void useAsynGetMobileCode() { val okHttpClient = OkHttpClient() val url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo" // 注意:实际使用应根据接口文档调整参数 val request = Request.Builder().url(url).get().build() val call = okHttpClient.newCall(request) call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { Log.e("useAsynGetMobileCode", e.toString()) } override fun onResponse(call: Call, response: okhttp3.Response): Unit { val content = response.body().string() Log.e("useAsynGetMobileCode", content) // 通过Handler发送消息到主线程 val message = Message() message.what = MSG_WEB_CONTENT message.obj = content handler.sendMessage(message) } })}
private void useOkhttpPost() { val url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo" // 参数通过FormBodyBuilder构建 val requestBody = FormBody.Builder() .add("mobileCode", "13456789999") .add("userID", "") .build() val okHttpClient = OkHttpClient() val request = Request.Builder().url(url).post(requestBody).build() val call = okHttpClient.newCall(request) call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { Log.e("useOkhttpPost", e.toString()) } override fun onResponse(call: Call, response: okhttp3.Response): Unit { val content = response.body().string() Log.e("useOkhttpPost", content) // 发送消息到主线程 val message = Message() message.what = MSG_WEB_CONTENT message.obj = content handler.sendMessage(message) } })}
private void useOkhttpGetImage() { val url = "http://www.gdcp.edu.cn/service?token=5a5d0c3fa9a145719be5b98f7b49eb56" val okHttpClient = OkHttpClient() val request = Request.Builder().url(url).get().build() val call = okHttpClient.newCall(request) call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { Log.e("useOkhttpGetImage", e.toString()) } override fun onResponse(call: Call, response: okhttp3.Response): Unit { Log.e("useOkhttpGetImage", response.message()) val inputStream = response.body().byteStream() val bitmap = BitmapFactory.decodeStream(inputStream)// {/*此处在子线程处理,需通过Handler发送到主线程*/} val message = Message() message.what = MSG_GET_IMG message.obj = bitmap handler.sendMessage(message) } })}
private val handler: Handler by lazy { Handler(object : Handler.Callback { override fun handleMessage(msg: Message): Boolean { when (msg.what) { MSG_WEB_CONTENT -> { val content = msg.obj as String tv_show.text = content return true } MSG_GET_IMG -> { val bitmap = msg.obj as Bitmap iv_show.setImageBitmap(bitmap) return true } } return false } })}
Bus实现了EventBus功能,可以用于消息传递。但在本文中,直接使用Handler更为简便。
转载地址:http://kxqaz.baihongyu.com/