Android AsyncTask使用详解
声明:本文是shunWang原创文章,转载请注明出处: http://shunji.wang/2017/02/26/asynctask/
要知道怎么使用AsyncTask首先得知道何为AsyncTask以及AsyncTask的作用,AsyncTask译成中文就是异步任务,在其内部封装了Handler机制,主要用来实现子钱程与UI线程的协同工作,比如子线程通知UI线程更新界面,所以AsyncTask的实质就是Google给我们封装好的Handler机制。
第一步:继承
AsyncTask是泛型抽象类,在使用前需要先创建一个类继承该抽象类,并实现其抽象方法。
public abstract class AsyncTask<Params, Progress, Result> 参数说明: Params:启动AsyncTask时传入的数据类型(可为Void); Progerss:表示进度的数据类型(可为Void); Result:任务执行完毕后返回的数据类型(可为Void); 第二步:实现抽象方法doInBackground; @Override protected Object doInBackground(Object[] objects) { return null; } 第三步:重写三个方法,这四个方法的作用后面一点说,先说步骤; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onProgressUpdate(Object[] values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); } 这四个方法的运行顺序见下图: 方法说明: onPreExecute():在异步任务执行前被调用,做准备工作; doInBackground():执行后台任务,返回结果由onProgressUpdate()接收(注意此方法是在子线程中运行); onProgressUpdate():后台任务执行过程中调用publishProgress()方法更新任务进度时被调用; onPostExecute():当后台任务执行完之后被调用,用于返回结果; 第四步:调用AsyncTask的实例方法execute()执行一个异步任务
任务的终止: @Override protected void onCancelled() { super.onCancelled(); }
废话就只说这么多了,最后上完整的代码供大家参考: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void myClick(View view) { //创建异步任务并执行,参数传递给后台任务doInBackground new MyAsync().execute(1,2,3,4,5,6); } class MyAsync extends AsyncTask<Integer,Integer,Bitmap>{ private ImageView imageView; private ProgressDialog dialog; //在异步任务执行之前被调用,做准备工作。(被UI线程调用) @Override protected void onPreExecute() { super.onPreExecute(); Log.d("FSLog","onPreExecute"); imageView = (ImageView) findViewById(R.id.imageView); dialog = new ProgressDialog(MainActivity.this); dialog.setMax(100); dialog.setTitle("正在下载。。。"); dialog.show(); } //执行后台任务 (后台线程调用) @Override protected Bitmap doInBackground(Integer... params) { Log.d("FSLog","doInBackground" + params[2]); //publishProgress(100);这里调用这个方法就会触发onProgressUpdate() HttpURLConnection conn = null; InputStream fis = null; Bitmap bitmap = null; try { URL url = new URL("http://192.168.1.104:8080/HttpUrlConnectionServer/TomCat.jpg"); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(3000); conn.setConnectTimeout(3000); conn.setDoOutput(false); conn.setDoInput(true); conn.setUseCaches(true); conn.connect(); if(!(conn.getResponseCode() == HttpURLConnection.HTTP_OK)) { return null; } fis = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(fis); } catch (Exception e) { e.printStackTrace(); if(fis != null) { try { fis.close(); } catch (IOException e1) { e1.printStackTrace(); } } if(conn != null) { conn.disconnect(); } } return bitmap; } //当后台任务执行完之后被调用,用于返回结果 更新UI (被UI线程调用) @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); Log.d("FSLog","onPostExecute"); imageView.setImageBitmap(bitmap); dialog.dismiss(); } //后台任务执行过程中调用publishProgress()方法更新任务的进度时,被调用 (被UI线程调用) @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.d("FSLog","onProgressUpdate" + values[0]); } } }