AsyncTask是用来处理一些后台的比较耗时的任务,给用户带来良好的体验。AsyncTask扩展Thread,增强了与主线程的交互能力。
首先介绍AsyncTask中定义的以下几个方法:
onPreExecute():该方法在执行后台操作前被UI线程调用,可以做一些准备工作,如图片加载之前先显示进度条等
doInBackground(Params...):该方法运行在后台线程中,比较耗时的操作可以写在此方法中
onProgressUpdate(Progress...):该方法只有在doInBackground(Params...)方法中调用了publishProgress()方法时候才会执行,用来显示后台任务的进展情况
onPostExecute(Result): doInBackground(Params...)方法执行完毕以后,此方法会被UI线程调用,可以在此方法中对UI进行操作,比如显示图片内容等
其次是AsyncTask中的三个参数 :
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的进度值。
Result 后台执行任务最终返回的结果。
最后用一个异步加载网络图片的实例更好的体现AsyncTask的作用:
首先访问网络记得加入网络访问的权限
1.Android项目的MainActivity的xml文件中放置button按钮如图:
2.新建一个Activity用来显示网络加载的图片,在此Activity中新建一个内部类继承 AsyncTask 详情请参考代码以及注释:
xml文件中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".ImageActivity" > <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent"/> <ProgressBar android:id="@+id/progressBar1" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </RelativeLayout>
Activity 中:
package com.example.netdemo; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.Window; import android.widget.ImageView; import android.widget.ProgressBar; public class ImageActivity extends Activity { private ProgressBar progressBar; private ImageView imageView; //图片的地址 private static final String URL="http://img3.3lian.com/2013/s1/20/d/57.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_image); findViewById(); //启动 new MyAsyncTask().execute(URL); } private void findViewById() { // TODO Auto-generated method stub progressBar = (ProgressBar) findViewById(R.id.progressBar1); imageView = (ImageView) findViewById(R.id.imageView); } /** * @String 传入的参数为图片的URL地址,String类型, * @Void 进度值先不考虑所以返回为空, * @Bitmap 后台执行任务最终返回的结果为一张图片Bitmap类型 * @author cyf * */ class MyAsyncTask extends AsyncTask<String, Void, Bitmap>{ //后台没有运行完毕之前做的准备工作,在这我们让原本隐藏的progressBar显示 @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); //后台运行的时候进度条显示 progressBar.setVisibility(View.VISIBLE); } //在后台进行网络访问,得到图片并返回 @Override protected Bitmap doInBackground(String... arg0) { // TODO Auto-generated method stub String url=arg0[0]; Bitmap bitmap=null; //定义网络连接对象 URLConnection connection; InputStream is; try { connection= new URL(url).openConnection(); is=connection.getInputStream(); BufferedInputStream bis=new BufferedInputStream(is); //将输入流解析成Bipmap bitmap=BitmapFactory.decodeStream(bis); is.close(); bis.close(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bitmap; } //在次方法中接收后台返回的Bitmap值并且设置到UI @Override protected void onPostExecute(Bitmap result) { // TODO Auto-generated method stub super.onPostExecute(result); //显示的progressBar再设置为隐藏 progressBar.setVisibility(View.GONE); //在此方法中设置UI线程显示图片 imageView.setImageBitmap(result); } } }
上结果图:
点击button之后的准备界面(progressBar显示表示正在加载):
加载完成之后:
欢迎大家提供意见,希望能给大家带来帮助,谢谢。