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网络请求的三种方式
# 会报
# 回调
# 使用这个
# 不同类型
# 结束之后
# 返回值
# 是一个
# 就会
# 是在
# 你是
# 还在
# 的说
# 不懂
# 给我们
# 我又
# 很容易
# 能在
# 可在
# 写了
# 咳咳
相关文章:
建站主机是否属于云主机类型?
建站主机与服务器功能差异如何区分?
建站之星如何助力企业快速打造五合一网站?
怎么将XML数据可视化 D3.js加载XML
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
七夕网站制作视频,七夕大促活动怎么报名?
三星网站视频制作教程下载,三星w23网页如何全屏?
建站之星伪静态规则如何正确配置?
广德云建站网站建设方案与建站流程优化指南
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
如何在建站主机中优化服务器配置?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
如何快速生成专业多端适配建站电话?
建站主机空间推荐 高性价比配置与快速部署方案解析
,在苏州找工作,上哪个网站比较好?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
,怎么用自己头像做动态表情包?
已有域名能否直接搭建网站?
如何做静态网页,sublimetext3.0制作静态网页?
如何在IIS中配置站点IP、端口及主机头?
建站之星备案是否影响网站上线时间?
python的本地网站制作,如何创建本地站点?
如何快速生成ASP一键建站模板并优化安全性?
如何选择CMS系统实现快速建站与SEO优化?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
黑客如何利用漏洞与弱口令入侵网站服务器?
如何在IIS中新建站点并配置端口与物理路径?
微课制作网站有哪些,微课网怎么进?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
css网站制作参考文献有哪些,易聊怎么注册?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
简单实现Android文件上传
如何在搬瓦工VPS快速搭建网站?
建站主机选哪家性价比最高?
如何通过云梦建站系统实现SEO快速优化?
长沙企业网站制作哪家好,长沙水业集团官方网站?
网站制作公司排行榜,四大门户网站排名?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何撰写建站申请书?关键要点有哪些?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
建站主机数据库如何配置才能提升网站性能?
内网网站制作软件,内网的网站如何发布到外网?
想学网站制作怎么学,建立一个网站要花费多少?
*请认真填写需求信息,我们会在24小时内与您取得联系。