android AsynTask处理返回数据和AsynTask使用get,post请求
发布时间 - 2026-01-10 22:23:46 点击率:次Android是一个单线程模型,Android界面(UI)的绘制都只能在主线程中进行,如果在主线程中进行耗时的操作,就会影响UI的绘制和事件的响应。所以在android规定,不可在主线中进行耗时操作,否则将发生程序无响应(ANR)问题。

解决办法:开启新的线程进行耗时操作
开启新的线程可以new Thread() 或实现Runnable接口
什么要使用AsyncTask呢?
如果是使用Thread的run()方法,run()结束之后没有返回值。所以必须要自己建立通信机制
AsyncTask将所有的线程通信都封装成回调函数,调用逻辑容易书写。尤其是在异步处理结束之后,有回调函数进行收尾处理。咳咳,程序员都懒的么
Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask 当然是那个简单就用那个咯
最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作~不然会报:android.os.NetworkOnMainThreadException
什么是AsyncTask(原谅宝宝偷的图 嘿嘿 不过真的解释的很清楚呢)
注意:
Task的实例必须在UI Thread中创建
execute方法不惜在UI thread中创建
task只能被执行一次 多次调用时会出现异常
通用AsyncTask 以及在主线程中使用网络请求回返的数据
通用AsyncTask是什么意思呢 发送不同的请求返回不同类型的数据 难道要一个类型写个AsyncTask 岂不是麻烦死咯
还有一种情况 我们通过异步任务得到了一个对象然后在一下行立刻使用这个对象逻辑完全没问题但是运行之后会报空指针异常。这是怎么回事呢?
AsycnTask开始了一个新的线程,但是主线程并没有停止还在继续运行,马上就使用这个对象,而你新开的线程可能正在访问网络这个对象为空
你无法确定AsycnTask什么时候才能获取到数据,网快嗖的一下就好了,网慢就要等好久。
看一个简略的小例子
首先呢 我们使用异步任务的时候要处理不同类型的数据把这个Http设置泛型类第三个参数返回值类型设置为泛型不管你是什么类型的数据全部ok
我又写了一个接口作为Http的属性 在onPostExecute方法调用其中的onResponse方法在Test中实现接口
这个接口的作用完全可以理解为一个监听事件 checkbox的改变监听触发条件是 是否选中这个接口监听是否有数据 完成网络访问有数据的时候就调用
我们在主线程中完成接口的实现已经在主线程中实现了返回来的数据还不是任君宰割阿~~~~~
public class Http<T> extends AsyncTask<String,Void,T> {
private OnResponseListener<T> listener;
public void setListener(OnResponseListener<T> listener) {
this.listener = listener;
}
@Override
protected T doInBackground(String... params) {
return null;
}
@Override
protected void onPostExecute(T t) {
super.onPostExecute(t);
if (listener!=null){
listener.onResponse(t);
}
}
//接口 类似一个监听事件
public interface OnResponseListener<T>{
void onResponse(T t);
}
}
//获取数据的测试类
public class Test {
//要获取的user对象
private User user1=null;
public void get(){
//创建网络访问实例
Http<User> http=new Http<User>();
//重写接口
http.setListener(new Http.OnResponseListener<User>() {
@Override
public void onResponse(User user) {
user1=user;
}
});
http.execute("xxx.balabala.com");
}
}
在发送请求的时候很容易就带个参数,请求的方式呢 无非就是get,post 两者的区别呢大白话的说get不安全参数通过url直接传过去post安全参数加密一下子
下面贴一下AsyncTask在get和post请求时核心代码doInBackground方法
GET
protected T doInBackground(String... params) {
//网络连接对象
HttpURLConnection connection=null;
//输入流 获取网络数据
InputStream is=null;
//字节数组输出流
ByteArrayOutputStream bos=null;
try {
//获取网络连接对象
connection=(HttpURLConnection) new URL(params[0]).openConnection();
//设置get请求 必须大写
connection.setRequestMethod("GET");
//获取网络请求码 200 400 500之类 不懂百度
int code=connection.getResponseCode();
if(code==200){
//获取流
is=connection.getInputStream();
//临时字节数组
byte [] b=new byte[1024];
int len=-1;
bos=new ByteArrayOutputStream();
while ((len=is.read(b))!=-1){
//写入数据
bos.write(b,0,len);
}
String json=bos.toString("utf-8");
T t=JSON.parseObject(json,type);
return t;
}else{
Log.e("error","网络访问失败==========="+code);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (bos!=null){
bos.close();
}
if (is!=null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (connection!=null){
connection.disconnect();
}
}
return null;
}
POST
post和get的区别 就是post多了一段处理参数的代码
protected T doInBackground(String... params) {
//分割url 分为地址和参数两部分
String[] strArr=params[0].split("\\?");
HttpURLConnection connection=null;
//输出流
OutputStream os=null;
//输入流
InputStream is=null;
ByteArrayOutputStream bos=null;
try {
connection=(HttpURLConnection) new URL(strArr[0]).openConnection();
connection.setRequestMethod("POST");
//设置允许输入 输出 默认值true 不写也可以
connection.setDoOutput(true);
connection.setDoInput(true);
os=connection.getOutputStream();
//把参数写入
os.write(strArr[1].getBytes("utf-8"));
os.close();
int code=connection.getResponseCode();
if(code==200){
is=connection.getInputStream();
byte [] b=new byte[1024];
int len=-1;
bos=new ByteArrayOutputStream();
while ((len=is.read(b))!=-1){
bos.write(b,0,len);
}
String json=bos.toString("utf-8");
T t=JSON.parseObject(json,type);
return t;
}else{
Log.e("error","网络访问失败==========="+code);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (bos!=null){
bos.close();
}
if (is!=null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (connection!=null){
connection.disconnect();
}
}
return null;
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# android
# Asyn
# Task
# 详解Android:向服务器提供数据之get、post方式
# Android中post和get的提交方式【三种】
# Android中使用OkHttp包处理HTTP的get和post请求的方法
# Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
# android平台HttpGet、HttpPost请求实例
# android使用url connection示例(get和post数据获取返回数据)
# Android发送GET与POST请求的DEMO详解
# android之HttpPost&HttpGet使用方法介绍
# Android HttpClient GET或者POST请求基本使用方法
# 安卓GET与POST网络请求的三种方式
# 会报
# 回调
# 使用这个
# 不同类型
# 结束之后
# 返回值
# 是一个
# 就会
# 是在
# 你是
# 还在
# 的说
# 不懂
# 给我们
# 我又
# 很容易
# 能在
# 可在
# 写了
# 咳咳
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Android利用动画实现背景逐渐变暗
如何用VPS主机快速搭建个人网站?
如何自定义建站之星模板颜色并下载新样式?
如何用IIS7快速搭建并优化网站站点?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
JS经典正则表达式笔试题汇总
无锡营销型网站制作公司,无锡网选车牌流程?
EditPlus中的正则表达式 实战(2)
Java遍历集合的三种方式
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
iOS UIView常见属性方法小结
Python结构化数据采集_字段抽取解析【教程】
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何在IIS中新建站点并解决端口绑定冲突?
Android滚轮选择时间控件使用详解
jQuery 常见小例汇总
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
教学论文网站制作软件有哪些,写论文用什么软件
?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何用5美元大硬盘VPS安全高效搭建个人网站?
Python图片处理进阶教程_Pillow滤镜与图像增强
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何用西部建站助手快速创建专业网站?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Laravel如何处理CORS跨域请求?(配置示例)
如何构建满足综合性能需求的优质建站方案?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
深圳网站制作培训,深圳哪些招聘网站比较好?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
七夕网站制作视频,七夕大促活动怎么报名?
Bootstrap CSS布局之列表
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何在IIS中配置站点IP、端口及主机头?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化

