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,首先会让我必须去实现一个方法
@Override
protected Integer doInBackground(String... params) {
return null;
}
这个方法也是异步里面最核心的一个方法,doInBackground方法是在异步里面的,所以我们把耗时操作都放在这个方法中去进行。最终return一个null或我们需要的数据,传入onPostExecute方法中去做处理。
我们实现第二个方法:
@Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
onPostExecute方法是当doInBackground执行完毕之后才会执行的,一般我们在这边接收耗时操作处理完后返回过来的一个结果。doInBackground中的return的值将会传入onPostExecute中,在这边也就是result。这个方法是在主线程中执行的,所以我们可以在这个方法中对其更新UI界面。
AsyncTask中的第三个方法
@Override
protected 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;
@Override
protected 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到这里就结束了,有问题欢迎大家留言~~~