android http与后台任务

android http与后台任务

网络连接基本

获取网络使用权限
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)
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值