Android 异步任务AsyncTask的使用
来源:互联网 发布:sendmail php 编辑:程序博客网 时间:2024/04/23 19:53
2017/05/02
时隔几个月,前段时间因为一直被各种事情耽搁,所以一直没有时间去写博客。最近虽然还是很忙,但是觉得还是应该抽出时间来写博客。今天开始,我会争取做到每三天更新一篇博客。希望在csdn的博客中记录我的成长,也希望大家可以从我的博客中学到知识。(如有写错,欢迎指出修正!)
今天这边博客写的是Android异步方面的知识。首先来说一下,异步到底是什么含义:
百度百科
异步:一种通讯方式,对设备需求简单。我们的PC机提供的标准通信接口都是异步的。
异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。
异步的另外一种含义是计算机多线程的异步处理。与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程。
但此处需要明确的是:异步与多线程与并行不是同一个概念.
上面是百度百科对异步的定义。异步字面意义已经解释的很清楚了,就是不同步的意思。
总所周知,Android的UI只能在主线程中对其进行更新,也就是我们所谓的UI线程。而主线程中是不允许做耗时操作的,根据Android的机制,你在主线程中做耗时操作,它会认定你的APP是处于无响应状态,从而kill了你的APP。所以在对耗时操作,我们应该将其放到异步中去做处理。
这里做一个在异步中更新进度条的小案列。下面县上一个gif图,我知道你们进来都是先找图的,我也是这样的= =。
要做异步,首先我们得写一个继承AsyncTask的类,
class Task_1 extends AsyncTask<String, Integer, Integer>
上面三个参数分别代表的意思是:
第一个String代表输入到任务的参数类型,也即是doInBackground()的参数类型
第二个Integer代表处理过程中的参数类型,也就是doInBackground()执行过程中的产出参数类型,通过publishProgress()发消息传递给onProgressUpdate()一般用来更新界面
第三个Integer代表任务结束的产出类型,也就是doInBackground()的返回值类型,和onPostExecute()的参数类型
继承于AsyncTask,首先会让我必须去实现一个方法
@Overrideprotected Integer doInBackground(String... params) { return null;}
这个方法也是异步里面最核心的一个方法,doInBackground方法是在异步里面的,所以我们把耗时操作都放在这个方法中去进行。最终return一个null或我们需要的数据,传入onPostExecute方法中去做处理。
我们实现第二个方法:
@Overrideprotected void onPostExecute(Integer result) { // TODO Auto-generated method stub super.onPostExecute(result);}
onPostExecute方法是当doInBackground执行完毕之后才会执行的,一般我们在这边接收耗时操作处理完后返回过来的一个结果。doInBackground中的return的值将会传入onPostExecute中,在这边也就是result。这个方法是在主线程中执行的,所以我们可以在这个方法中对其更新UI界面。
AsyncTask中的第三个方法
@Overrideprotected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values);}
onProgressUpdate方法一般是用来更新进度的,让用户可以知道这个耗时操作的更新情况,带来更好的体验。这个方法中可以直接去更新UI视图。
至于如何开启一个异步的执行,Android里面给了我们一个方法,
execute(Params… params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行
我们可以通过实例化异步的类,然后直接.execute()即可开启这个异步任务。
切记,.execute()方法只可以在主线程中去调用!!!
异步的基本使用大致就是这些,下面吧刚刚demo的代码贴一下:
Async.java
public class Async extends Activity{private Button btn_1;private ProgressBar pro_1;@Overrideprotected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); setContentView(R.layout.async); btn_1 = (Button) findViewById(R.id.btn_1); pro_1 = (ProgressBar) findViewById(R.id.pro_1); pro_1.setMax(100); btn_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Task_1 t = new Task_1(); t.execute(); Toast.makeText(Async.this , "开始执行进度条" , Toast.LENGTH_SHORT).show(); } });}class Task_1 extends AsyncTask<String, Integer, Integer>{ Integer b = 0; @Override protected Integer doInBackground(String... params) { while(b <= 100){ try { Thread.sleep(100); publishProgress(b); b++; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } @Override protected void onPostExecute(Integer result) { // TODO Auto-generated method stub super.onPostExecute(result); } @Override protected void onProgressUpdate(Integer... values) { pro_1.setProgress(values[0]); super.onProgressUpdate(values); }}
async.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingTop="100dp"> <Button android:id="@+id/btn_1" android:layout_width="match_parent" android:layout_height="40dp" android:text="开始第一个进度条" android:background="@drawable/button" android:layout_margin="10dp" android:textColor="#fff" android:textSize="22sp" /> <ProgressBar android:id="@+id/pro_1" android:layout_marginTop="50dp" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="15dp" /></LinearLayout>
button.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" > <corners android:radius="10dp" /> <solid android:color="#00f"/></shape>
整个异步的小demo到这里就结束了,有问题欢迎大家留言~~~
- Android异步任务之AsyncTask的使用
- Android 异步任务 AsyncTask 的使用总结
- Android 异步任务AsyncTask的使用
- Android中异步任务AsyncTask的使用
- Android AsyncTask异步任务的使用
- Android 异步任务AsyncTask的使用
- Android异步任务AsyncTask使用
- android的异步任务AsyncTask
- 异步任务AsyncTask的使用
- AsyncTask异步任务的使用
- Android带进度条的文件上传,使用AsyncTask异步任务
- Android中AsyncTask(异步执行任务)的使用
- Android 异步任务AsyncTask类的简单使用
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- Mybatis Generator(简称MBG)的最完整配置文件
- socket阻塞与非阻塞,同步与异步、I/O模型
- Jmeter+Ant性能测试报告
- leetcode 第四题 Median of Two Sorted Arrays
- 动态sql之使用choose标签
- Android 异步任务AsyncTask的使用
- Java持续受欢迎的4个理由
- 安装配置apache
- lucene
- 裸机开发-Makefile文件的解析
- jquery复选框的操作
- 用MERGE改写UPDATE的优化
- Unity初始化函数以及退出函数的执行顺序
- asp.net中Server.MapPath的使用