安卓进阶系列-08异步加载AsynsTask使用
利用AsyncTask和OkHttp进行API数据请求
- 背景
- 从安卓3.0开始,不允许在主线程和UI线程中进行网络请求,因为可能会造成线程堵塞。
- 因此,只能在子线程进行网络请求,出现了很多请求的方法,例如开启子线程利用Message传递数据,或者OkHttp封装了异步请求,会开启新线程进行网络请求。
- 本案例使用OkHttp(主要因为方便使用,比起HttpConnection和HttpClient效率不遑多让,甚至仍有胜之)进行网络请求,但是使用同步请求(不会开启新的线程,因此会崩溃)。
- 本案例,处理网络请求的方式为异步加载处理,利用AsyncTask开启一个异步任务,任务返回结果并进行处理操作。
- 配置
- 添加okhttp和gson的依赖
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.google.code.gson:gson:2.8.2'
- 添加okhttp和gson的依赖
- 介绍
- 一般,将任务封装为一个类并继承AsyncTask<Params, Progress,Result>。继承AsyncTask需要指定三个泛型参数。
- Params:启动任务时输入参数的类型,我这里传入了一个URL路径。
- Progress:后台任务执行中返回进度值的类型,可以用来显示进度。
- Result:后台任务完成后返回结果的类型,我这里是一个自定义的Item。
- 如果你用的IDE是比较智能的如Android Studio,那么会提示实现相应的方法,其中doInBackGround是必须实现的,也是唯一一个子线程的方法。
- doInBackGround:必须重写,子线程在这个方法里面进行耗时操作。(这个方法的进行在子线程中)
- onPreExecute:执行后台耗时操作前被调用,通常在方法里面进行一些初始化的操作。
- onPostExecute:当doInBackground完成后,系统会自动调用这个方法,并且将doInBackground方法返回的值传给该方法。
- onProgressUpdate:在doInBackground方法中调用publishProgress方法时,更新任务的执行进度后,会触发这个方法。
- 一般,将任务封装为一个类并继承AsyncTask<Params, Progress,Result>。继承AsyncTask需要指定三个泛型参数。
- 实战使用
- 首先需要在manifest文件中添加网络权限。
- 使用OkHttp+AsyncTask发送网络请求并使用Gson解析API数据,渲染到界面的一个TextView上。
- 简单编写一个只含有name属性的Bean类。
- 编写Task类,继承自AsyncTask并在后台使用OkHttp进行网络请求。请求的是自己编写的一个API网站(API的WEB服务搭建这里不做叙述,请求得到的是json格式数据。)。
- 请求的数据结构
package com.zc.testforasynctask;import android.content.Context;import android.os.AsyncTask;import android.util.Log;import android.widget.TextView;import android.widget.Toast;import com.google.gson.Gson;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MyTask extends AsyncTask<String, String, Item> {private Context mContext;private TextView tv;public MyTask(Context mContext, TextView tv) {this.mContext = mContext;this.tv = tv;}@Overrideprotected void onPreExecute() {super.onPreExecute();Toast.makeText(mContext, "开始寻找网络资源", Toast.LENGTH_SHORT).show();}private String baseUrl = "http://13.250.1.159:8000/api/";@Overrideprotected Item doInBackground(String... strings) {Item result;try {Thread.sleep(0b1111101000);OkHttpClient client = new OkHttpClient();String nowUrl = baseUrl + "merchants/" + strings[0] + ".json";Request request = new Request.Builder().url(nowUrl).build();Response response = client.newCall(request).execute();if (response.isSuccessful()){result = parseItemJsonObject(response.body().string());Log.i("msg", result.getName());}else {Toast.makeText(mContext, "无结果", Toast.LENGTH_SHORT).show();return null;}}catch (Exception e){Toast.makeText(mContext, "网络连接异常", Toast.LENGTH_SHORT).show();return null;}return result;}@Overrideprotected void onPostExecute(Item item) {super.onPostExecute(item);if(item != null){tv.setText(item.getName());}else {tv.setText("数据解析为空");}}private Item parseItemJsonObject(String jsonData) {// 解析Json对象try {if (jsonData != null) {//创建一个Gson对象Gson gson = new Gson();Item item = gson.fromJson(jsonData,Item.class);return item;}else {return null;}}catch (Exception e){e.printStackTrace();return null;}}}
- 请求的数据结构
- 主活动进行事件绑定和点击事件注册
- 代码见GitHub
- 效果展示
- 补充说明
- 具体代码和环境配置见我的GitHub,欢迎star或者fork
- 欢迎指出优化之处
安卓进阶系列-08异步加载AsynsTask使用相关推荐
- combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...
AssetBundle的定义和作用: 1,AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载. 2,AssetBundle自身保存着互相的依赖关系 ...
- android异步加载图片并缓存到内存和sd卡上,Android批量图片加载经典系列——采用二级缓存、异步加载网络图片...
http://www.cnblogs.com/jerehedu/p/4560119.html 2015-06-08 09:20 by 杰瑞教育, 232 阅读, 1 评论, 收藏, 编辑一.问题描述 ...
- Flutter进阶—网络与本地异步加载资源
通过网络加载JSON文件的实例 import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/ ...
- Android进阶:ListView性能优化异步加载图片 使滑动效果流畅
ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...
- vue进阶测试——生命周期和异步加载的微妙关系
本文继续探索vue中的坑,关于vue的生命周期和异步加载相关处理的文章还比较少,可能是自己没有用谷歌而用百度的缘故吧.关于异步操作和生命周期,会牵扯到浏览器的单线程处理机制,以及ES中的promise ...
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
UIL( Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)) http://blog.csdn.net/vipzjyno1/article/detai ...
- android多种方式实现异步加载图片
记得之前做安卓应用时都是在2.2以下的版本,如果在UI线程中进行耗时操作,比如http,socket等 会产生android.os.NetworkOnMainThreadException 如果异步加 ...
- js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
最新文章
- 迎娶了校花的学霸,竟把日子过成了这个样子!
- 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )
- json java 实例_java JSON数据转对象
- RunTime类,后台快速打开浏览器
- 闭包/Block当成函数参数实现回调
- sdut 2074 区间覆盖问题(贪心)
- css x轴不滚动_泡沫轴滚动放松是什么原理:你并不了解泡沫轴
- 算法(八):图解KNN算法
- MyBatis----resultMap的使用
- 转载explicit关键字
- ubuntu14.04 的网络配置
- MSN QQ网页聊天代码
- android 模拟器 锁屏,如何在模拟器中测试Android锁屏小部件?
- 【JavaWeb】最详细的小白笔记!!!
- 计算机应用新媒体是什么,新媒体概念,什么是新媒体
- c语言中begin用法,C++ deque cbegin()用法及代码示例
- sql语句的增删改操作附加代码
- 路由追踪traceroute分析
- 开篇 | 想成为技术牛人?先搞定网络协议!
- 如何开发一款前端工具