首先介绍AsyncTask中定义的以下几个方法:
onPreExecute():该方法在执行后台操作前被UI线程调用,可以做一些准备工作,如图片加载之前先显示进度条等
doInBackground(Params...):该方法运行在后台线程中,比较耗时的操作可以写在此方法中
onProgressUpdate(Progress...):该方法只有在doInBackground(Params...)方法中调用了publishProgress()方法时候才会执行,用来显示后台任务的进展情况
onPostExecute(Result): doInBackground(Params...)方法执行完毕以后,此方法会被UI线程调用,可以在此方法中对UI进行操作,比如显示图片内容等。
----------------------------------------------------------
其次是AsyncTask中的三个参数 :
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的进度值。
Result 后台执行任务最终返回的结果。
------------------------------------------------------------------
最后用一个异步加载网络图片的实例更好的体现AsyncTask的作用:
新建一个空的Android项目工程,我新建的是AsyncTaskTest,
先贴出项目最终的运行效果图啦:
然后修改main_activity.xml的代码,如下:
由此可知,主布局并不复杂,LinearLayout里嵌套一个Button,和引用一个名字叫layout.xml的文件。
效果图如下:
那么问题来了,layout.xml文件是何方神圣呢?
你们可以猜猜,也可以自己动手吧。(文章尾处有惊喜哦、)
主活动类MainActivity.java的代码修改如下:
package com.yaowen.asynctasktest;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;public class MainActivity extends AppCompatActivity { private Button downBitmap; private ProgressBar progressBar; private ImageView imageView; //将要异步加载的图片的地址,这里我用的自己搭建的服务器上图片的地址啦 private static final String URL_PATH = "http://192.168.3.200:8080/mytest/1.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); // new MyAsyncTask().execute(URL1); } /** * 初始化所有UI控件 **/ private void initView() { downBitmap = (Button) findViewById(R.id.btn_test); progressBar = (ProgressBar) findViewById(R.id.progressBar1); imageView = (ImageView) findViewById(R.id.imageView); downBitmap.setOnClickListener(new Listener()); } /** * 按钮事件响应类,用于启动MyAsyncTask类异步加载并显示图片 **/ class Listener implements View.OnClickListener { @Override public void onClick(View v) { if (v.getId() == R.id.btn_test) { //这里启动MyAsyncTask类异步加载并显示图片 new MyAsyncTask().execute(URL_PATH); } } } /** * 自定义异步任务类 * * @author YAOWEN * @String 传入的参数为图片的URL地址,String类型, * @Void 进度值先不考虑所以返回为空, * @Bitmap 后台执行任务最终返回的结果为一张图片Bitmap类型 */ class MyAsyncTask extends AsyncTask{ @Override protected void onPreExecute() {//后台没有运行完毕之前做的准备工作,在这我们让原本隐藏的progressBar显示 super.onPreExecute(); progressBar.setVisibility(View.VISIBLE);//后台运行的时候进度条显示 } @Override protected Bitmap doInBackground(String... params) {//在后台进行网络访问,得到图片并返回 String url = params[0]; Bitmap bitmap = null; URLConnection connection;//定义网络连接对象 InputStream inputStream; try { connection = new URL(url).openConnection(); inputStream = connection.getInputStream(); BufferedInputStream bis = new BufferedInputStream(inputStream); //将输入流解析成Bipmap bitmap = BitmapFactory.decodeStream(bis); inputStream.close(); bis.close(); } catch (IOException e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) {//在此方法中接收后台返回的Bitmap值并且设置到UI super.onPostExecute(bitmap); progressBar.setVisibility(View.GONE); //显示的progressBar再设置为隐藏 imageView.setImageBitmap(bitmap); //在片此方法中设置UI线程显示图 } }}
代码为了可读性,我特意加入了注释,这样子便于一些初学者读懂代码吧~~~~~~
上面说到了文章尾处有惊喜,所以叫layout.xml的文件原来是这个“妖孽”!
也不复杂啦,相信大家都能想出来了!!!!
最后,祝大家学有所成~!