今天开始写博客,目的就是为了方便记录学习的一些要点,同时也和大家交流。
第一篇是关于Android的异步任务(AsyncTask)的。异步任务是为了在其它线程中更新UI。AsyncTask是一个抽象类,通常用于继承。
构建AsyncTask子类的泛型参数
AsyncTask是一个抽象类,通常用于被继承.继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务时输入的参数类型.
Progress:后台任务执行中返回进度值的类型.
Result:后台任务执行完成后返回结果的类型.
.构建AsyncTask子类的回调方法
AsyncTask主要有如下几个方法:
doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在此方法中完成.
onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作.
onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.
onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.
onPreExecute方法会首先执行,之后执行doInBackground方法,最后执行onPostExecute方法。onProgressUpdate方法需要在doInBackground方法中手动调用。
下面展示使用异步处理加载网络图片.网络操作作为一个不稳定的耗时操作,从4.0开始就被严禁放入主线程中.所以在显示一张网络图片时,我们需要在异步处理中下载图片,并在UI线程中设置图片.
ImageTest.java
用于处理异步操作,从网络中加载图片
import java.io.BufferedInputStream;
import java.net.URL;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
public class ImageTest extends Activity {
private ImageView imageView;
private ProgressBar progressBar;
private static String URL = "http://www.deskcar.com/desktop/fengjing/2013812103350/11.jpg";//图片地址
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image);
imageView = (ImageView)findViewById(R.id.image);
progressBar = (ProgressBar)findViewById(R.id.progress);
//通过AsyncTask的execute方法开启异步线程操作,传递的参数是doInBackground方法中的参数
new MyAsyncTask().execute(URL);
}
//通过一个内部类实现异步操作
class MyAsyncTask extends AsyncTask<String,Void,Bitmap>{
/**
* 对异步操作进行初始化操作
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
progressBar.setVisibility(View.GONE);
imageView.setImageBitmap(bitmap);
}
/**
* 进行异步操作
* @param params
* @return 返回AsyncTask中的第三个参数类型
*/