標籤:安卓 服務 ringbuf 寫入 nec 好的 puts htm val
由於近期網上搜尋了很多Android串連到http的方法, 可是2013年以前的方法現在都不能用了,要麼報錯,要麼被遺棄,歲月留下來的東西只能自己整理了。
其實很簡單,就一個HttpUtil通用類。可以實現Get和Post方法,其他東西,裡面可以隨便改改,基本就這樣吧。
參數的話,我用了一個 strUrlPath網址、params索引值對、encode編碼(如utf-8)。
package Utilimport android.os.Handlerimport android.os.Messageimport android.view.Viewimport android.widget.Buttonimport java.io.BufferedReaderimport java.io.ByteArrayOutputStreamimport java.io.IOExceptionimport java.io.InputStreamimport java.io.InputStreamReaderimport java.io.OutputStreamimport java.net.HttpURLConnectionimport java.net.MalformedURLExceptionimport java.net.URLimport java.net.URLEncoder/** * Created by Jason_Jan on 2017/7/5. */object HttpUtil { private var handler: Handler? = null private var my_result: String? = null fun httpGet(strUrlPath: String, params: Map<String, String>, encode: String): String { var strUrlPath = strUrlPath /* byte[] data = getRequestData(params, encode).toString().getBytes();//獲得請求體*/ /* String target="http://emb.mobi/register";*/ var result: String? = null val append_url = getRequestData(params, encode).toString() strUrlPath = strUrlPath + "?" + append_url try { val url = URL(strUrlPath) val urlConn = url.openConnection() as HttpURLConnection urlConn.connectTimeout = 5000//逾時時間 urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")//設定頭部資訊,其實沒什麼用 //主角開始登場,不注意就是幾個小時的調試,輸入資料流 val `in` = InputStreamReader(urlConn.inputStream) val buffer = BufferedReader(`in`) var inputLine: String? = null //迴圈逐行讀取輸入資料流中的內容 result = ""//每次清空資料 while (buffer.readLine().apply { inputLine = this } != null) { result += inputLine!! + "\n" } `in`.close() urlConn.disconnect() } catch (e: MalformedURLException) { e.printStackTrace() } catch (ioe: IOException) { ioe.printStackTrace() return "err:" + ioe.message.toString() } return result!! } private fun getRequestData(params: Map<String, String>, encode: String): StringBuffer { val stringBuffer = StringBuffer() //儲存封裝好的請求體資訊 try { for ((key, value) in params) { stringBuffer.append(key) .append("=") .append(URLEncoder.encode(value, encode)) .append("&") } stringBuffer.deleteCharAt(stringBuffer.length - 1) //刪除最後的一個"&" } catch (e: Exception) { e.printStackTrace() } return stringBuffer } fun httpPost(strUrlPath: String, params: Map<String, String>, encode: String): String { val data = getRequestData(params, encode).toString().toByteArray() try { val url = URL(strUrlPath) val http = url.openConnection() as HttpURLConnection http.connectTimeout = 5000 http.doInput = true http.doOutput = true http.requestMethod = "POST" http.useCaches = false//使用post方式不能用緩衝 //佈建要求體的類型是文本類型 http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") //佈建要求體的長度 http.setRequestProperty("Content-Length", data.size.toString()) //獲得輸出資料流,向伺服器寫入資料 val out = http.outputStream out.write(data) val response = http.responseCode if (response == HttpURLConnection.HTTP_OK) { val inputStream = http.inputStream return dealResponseResult(inputStream) } } catch (ioe: IOException) { ioe.printStackTrace() return "err:" + ioe.message.toString() } return "-1" } fun dealResponseResult(inputStream: InputStream): String { var resultData: String? = null //儲存處理結果 val byteArrayOutputStream = ByteArrayOutputStream() val data = ByteArray(1024) var len = 0 try { while (inputStream.read(data).apply { len = this } != -1) { byteArrayOutputStream.write(data, 0, len) } } catch (e: IOException) { e.printStackTrace() } resultData = String(byteArrayOutputStream.toByteArray()) return resultData }}
使用方式很簡單--HttpUtil.方法名(參數),返回一個string,之後用Json解析工具來解析。
其次重中之重,安卓網路連接有點坑。下面從兩個方面談談。
1.getoutputstream這裡,一直報錯。解決方案:build.gradle
compile ‘com.squareup.retrofit:retrofit:1.8.0‘compile ‘com.squareup.okhttp:okhttp:2.1.0‘compile ‘com.squareup.okhttp:okhttp-urlconnection:2.1.0‘
2.其次,在AndroidManifest.xml中
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.INTERNET" />
Android Kotlin 串連 http