AsyncTask异步任务
来源:互联网 发布:舒尔se315 知乎 编辑:程序博客网 时间:2024/05/22 06:14
public abstract class AsyncTask<Params, Progress, Result> {
* 三种泛型类型分别代表“启动任务执行的输入参数 String”、“后台任务执行的进度 Integer”、“后台计算结果的类型 String”
* 在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用Java.lang.Void类型代替
注意:这里是泛型参数
使用的步骤及方法
创建一个自己的异步任务类继承AsyncTask,,,并重写里面的方法
* 方法
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些操作。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。
在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
* protected String doInBackground(String... params)
* 参数是可变参数,,,params[0]
* HttpGet get = new HttpGet(params[0]);
* 可以返回请求的数据,,,,然后在下面的方法onPostExecute接收进行操作
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上
* onCancelled()
* 取消一个正在执行的任务,onCancelled方法将会被调用
mTask.cancel(true);
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
/**
*展示异步任务的所有方法*/
private void asyncAll() {
//需要一个异步任务对象....在异步任务中去处理耗时的操作,比如获取网络...是放在子线程中(后台线程中)
/**
* 有三个泛型参数...这三个泛型参数都可以为空...Void
* Params 一般值得是执行任务的时候传递过来的数据,,,,一般是访问的url,,,可以为空Void
* Progress 当前这个任务执行的进度...如果需要的话一般是Integer,,,,不需要为空Void
* Result 异步任务执行完成以后返回的结果,,,如果没有结果Void,,,如果有指定返回值的泛型,一般访问网络返回的是json字符串...String
*/
AsyncTask<String, Void, String> asyncTask = new AsyncTask<String, Void, String>() {
//在doInBackground之前调用的方法,,,也就是异步任务开始执行的第一个方法
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//在后台执行的方法....相当于子线程...执行耗时的操作...不能再这个方法里面更新界面
@Override
protected String doInBackground(String... strings) {
try {
URL url = new URL(strings[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
int responseCode = connection.getResponseCode();
if (responseCode == 200){
InputStream inputStream = connection.getInputStream();
//publishProgress();
String json = streamToString(inputStream,"utf-8");
//json字符串已经获取到,,,也就是异步任务执行的结果获取到了
return json;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//异步任务执行进度发生改变的时候调用的方法,,,这个方法不会自动调用,,需要在doInBackGroud里面调用publishProgress()方法的时候会调用onProgressUpdate
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
//发送任务执行的结果到主线程,,,,这个方法是处于主线程,,,可以更新界面
//String json就是doInBackground返回的数据
@Override
protected void onPostExecute(String json) {
//json是doInBackgroud返回的,,,此时在这里可以进行解析,,设置适配器的操作
}
//异步任务取消的时候执行的方法...asyncTask.cancel(true);执行的时候会自动执行onCancelled
@Override
protected void onCancelled() {
super.onCancelled();
}
};
//异步任务对象如果需要执行,需要调用下面的方法.....
asyncTask.execute(网络地址);
//asyncTask.cancel(true);
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
/**
*常用
*/
AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... voids) {
String path = "http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653";
try {
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
int responseCode = connection.getResponseCode();
if (responseCode == 200){
InputStream inputStream = connection.getInputStream();
String json = streamToString(inputStream,"utf-8");
//json字符串已经获取到,,,也就是异步任务执行的结果获取到了
return json;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
//返回的数据可以解析
}
};
//调用
asyncTask.execute();
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
在使用AsyncTask的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
- Android异步任务AsyncTask
- AsyncTask异步任务
- 异步任务AsyncTask
- AsyncTask异步任务
- AsyncTask异步任务
- Android--AsyncTask异步任务
- Android AsyncTask异步任务
- 异步任务(AsyncTask)
- Android 异步任务 AsyncTask
- 异步任务(AsyncTask)
- android 异步任务 AsyncTask
- Android AsyncTask 异步任务
- Android AsyncTask异步任务
- AsyncTask异步任务
- AsyncTask异步任务
- AsyncTask异步任务
- 异步任务AsyncTask
- 异步任务AsyncTask
- 捉住一只小白
- 让XCode自动CodeReview你的代码-OCLint使用
- gradle编译报错
- JS变量的深入理解
- 448.Find All Numbers Disappeared in an Array 找出数组中所有消失的数字
- AsyncTask异步任务
- 用git与jelly 搭建面向世界的博客
- Python 基础
- 排序
- [cocos2dx_Lua]quick中的触摸事件
- 5 统计信息--优化主题系列
- 单片机的各种存储的含义和区别
- OJ
- [Linux] 总结各系统 双网卡绑定