安卓进阶系列-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 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
最新文章
- pandas(四) -- 数值计算
- java交换integer_Java比较和交换语义和性能
- 执行h2o的python命令时出现:TypeError: ‘NoneType‘ object is not callable
- Java 数据类型和 MySql 数据类型对应一览表
- 7.11计划,做个没心没肺的人
- QuickPart : 用户控件包装器 for Office SharePoint Server 2007
- Framehawk技术-思杰HDX
- 基于UNITY引擎开发的游戏源码修改方法
- 《用户故事地图》摘录
- 上班[卒]如何面对复杂工作?
- 一起学JAVA 学习路径 知识体系
- 二、C++反作弊对抗实战 (进阶篇 —— 4.遍历进程模块(暴力扫描整个内存找出被断链的))
- 绵阳师范学院2021计算机考试,绵阳师范计算机学院2021年招生计划
- 关于simplis仿真和驱动方法
- Java(回文数--一种比较简单的写法)
- 认识V模型,W模型,H模型三类模型
- 2021 河北取证比武决赛个人赛 题解 入侵溯源
- 听觉外围分析matlab,扫描附近的低功耗 Bluetooth 外围设备 - MATLAB blelist
- MathWorks 中国...
- 如何提高自己的知识水平?
- UE4 动画系统 源码及原理剖析