前言:
干咱们这一行的,难免要跟异步线程打交道。虽然呢,网上可以找到很多很多的资料,但是,我还是要写这一篇文章,毕竟是本博客的第一篇技术性质的文章嘛(凑凑数。。。),哈哈,废话不多说,这就进入罗嗦的正题。
正文:
本人暂时只接触了两种多线程的实现方式,一种是AsyncTask,另一种则是thread+looper。(写的有点罗嗦,我没有当大家是笨蛋,我只想写的详细点,给两年后的自己看的。。)
(一) AsyncTask
第一步是创建一个类,继承AsyncTask.
public class HelloWorld extends AsyncTask<Object, Object, Object> {
@Override
protected Object doInBackground(Object... params) {
<这里你可以进行一些耗时的工作,如下载数据等>
}
}
doInBackground(Object... params){} 是AsnycTask必须实现的方法(不然使用AsyncTask干嘛。。。),字面意思为后台处理,一般是进行数据处理。
AsyncTask '<>' 中的参数依次代表执行参数类型、进度参数类型和结果参数类型。
执行参数类型:代表传入的数据的类型,即doInBackground(Object... params)中的参数类型。
进度参数类型:就是doInBackground()执行过程中的产出参数类型,通过publishProgress()发消息 。
结果参数类型:就是doInBackground()执行结束后,产生的结果的类型。
doInBackgroud 实际上是一个子线程,所以呢,不能进行UI更改。有两个方法,如果有返回结果,那么重写onPostExecute方法。
public class HelloWorld extends AsyncTask<Object, Object, Object> {
@Override
protected Object doInBackground(Object... params) {
<这里你可以进行一些耗时的工作,如下载数据等>
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
<这里你可以进行一些UI操作>
}
}
一旦重写了此方法,doInBackgroud结束后,就直接调用此方法。
接下来要讲的是 publishProgress(),publishProgress方法中传的参数即进度参数。那到底是publish到哪里去呢?若你有要publish的东西,你必须重写onProgressUpdate方法。具体实现看代码。
public class HelloWorld extends AsyncTask<Object, Object, Object> {
@Override
protected Object doInBackground(Object... params) {
<这里你可以进行一些耗时的工作,如下载数据等>
publishProgress("正在操作,请稍等。。。")
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
<这里你可以进行一些UI操作>
}
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
t.setText((String)progress[0]);
<这里你可以进行一些UI操作>
}
}
除了上面几个常用的方法以外,还有一个方法,即onPreExecute。PreExecute顾名思义就是预先处理。它是在doInBackground前自动执行的。我习惯用它来开启一个进度条。这不代表只能在onPreExecute中开启进度条,只是这样做可复用性高一点。有时候面对一个相对复杂的项目,里面难免会需要很多很多的异步线程。我喜欢把继承AsyncTask的类写成一个公共类,这样就不必左extends一下,右extends一下。(本人是懒人,能少写几句代码就少写几句,不过不喜欢写注释的话,时间长了,容易被里面乱七八糟的逻辑弄晕了。。),废话不多说,看代码。
public class HelloWorld extends AsyncTask<Object, Object, Object> {
@Override
protected void onPreExecute() {
super.onPreExecute();
if(alertDialog!= null && !alertDialog.isShowing()){
alertDialog.show();
}
}
}
@Override
protected Object doInBackground(Object... params) {
<这里你可以进行一些耗时的工作,如下载数据等>
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
<这里你可以进行一些UI操作>
if(alertDialog!= null && alertDialog.isShowing()){
alertDialog.dismiss();
}
}
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
<这里你可以进行一些UI操作>
}
}
哎呀本来想一篇搞定异步线程的,谁知我太罗嗦了,看样子得再分个两篇了。回顾一下本文。主要讲了AsyncTask的三个参数的意思,以及AsyncTask自带的四个方法,即onPreExecute,doInBackground,onPostExecute和onProgressUpdate。下一篇将主要要讲述AsyncTask的取消和超时处理。