网络连接基本
获取网络使用权限
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.apps.photogallery">
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
自定义网络连接类FlickrFetchr
package com.example.apps.photogallery
import java.io.ByteArrayOutputStream
import java.io.IOException
import java.net.HttpURLConnection
import java.net.URL
class FlickrFetchr {
/**
* 获取数据
*/
fun getUrlBytes(urlSpec: String): ByteArray {
var url = URL(urlSpec) // 获取URL对象
var connection: HttpURLConnection = url.openConnection() as HttpURLConnection // 打开连接
try {
var out = ByteArrayOutputStream() //
var ent = connection.inputStream// 真正连接到url地址,如果是post请求就用outputStream()方法
if (connection.responseCode != HttpURLConnection.HTTP_OK) {
throw IOException(connection.responseMessage + ": with" + urlSpec)
}
var buffer = ByteArray(1024)
ent.read(buffer).apply {
out.write(buffer, 0, this) // 读取数据
}
out.close()
return out.toByteArray()
} finally {
connection.disconnect()
}
}
/**
* 将获取的字节码转换为字符串
*/
fun getUrlString(urlSpec: String): String {
return String(getUrlBytes(urlSpec))
}
}
AysncTask
定义AysncTask
/**
*@param 第一个参数可以指定转给execute(...)方法的输入参数类型,进而指定doInbackground方法的输入参数类型
* @param 第二个参数可指定发送进程更新锁需要的类型,
*@param 第3个泛型参数是AsyncTask返回结果的数据类型,doInBackGround()方法返回数据类型,以及onPostExecute方法输入的数据类型
*/
private inner class FetachItemTask : AsyncTask<String, Int, MutableList<GalleryItem>>() {
/**
* 在后台线程中执行
*/
override fun doInBackground(vararg params: String): MutableList<GalleryItem> {
publishProgress(1,2,3) // publicshProgress方法传递参数给onProgressUpdate()方法
params.forEach {
Log.i(TAG, it)
}
return FlickrFetchr().fetchItems()
}
/**
* 在ui线程中执行任务,在doInBackground执行完后才会执行
*/
override fun onPostExecute(items: MutableList<GalleryItem>) {
mItems = ArrayList<GalleryItem>(items)
setupAdapter()
}
/**
* 在ui线程中执行任务,通过publicProgress调用
*/
override fun onProgressUpdate(vararg values: Int?) {
var progress: Int? = values.get(0)
progress?.apply {
Log.e(TAG , this.toString())
}
}
}
使用Aysnctask
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
FetachItemTask().execute("test1","test2","tes3")
}
确定fragment是否绑定到activity
if(isAdded){ // 确定fragment是否绑定到Activity
mPhotoRecyclerView.adapter = PhotoAdpter(mItems)
}