我们知道,在Android中,只有UI线程能够更新UI,而子线程是不能更新UI。但是如果某个应用需要进行某种耗时的操作,如果在UI线程进行此操作的话,那会显得应用程序非常的卡顿,这个是不能允许存在的。于是,我们想到了使用子线程来进行这些耗时的操作,但是由于子线程不能更新UI,所以我们并不知道什么时候应该更新UI。
为了解决这个问题,Android出现了异步加载,而AsyncTask就是这个用途。
1.构建AsyncTask子类的参数
AsyncTask<Params, Progress. Result>是一个抽象类,通常用来被继承,继承AsyncTask需要指定如下三个泛型参数的:
A.Params:启动任务时输入参数的类型
B.Progress:后台任务执行中返回进度值的类型
C.Result:后台任务完成后返回结果的类型
2.构建AsyncTask子类的回调方法
A.doInBackGround:必须重写,子线程在这个方法里面进行耗时操作
B.onPreExecute:执行后台耗时操作前被调用,通常在方法里面进行一些初始化的操作
C.onPostExecute:当doInBackground完成后,系统会自动调用这个方法,并且将doInBackground方法返回的值传给该方法
D.onProgressUpdate:在doInBackground方法中调用publishProgress方法时,更新任务的执行进度后,会触发这个方法
3.使用AsyncTask来加载网络图片
1 class MyAsyncTask extends AsyncTask<String, Void, Bitmap> 2 { 3 4 @Override 5 protected Bitmap doInBackground(String... params) { 6 try { 7 Thread.sleep(3000); 8 } catch (InterruptedException e) { 9 e.printStackTrace(); 10 } 11 Bitmap bitmap = null; 12 String urlString = params[0]; 13 URLConnection urlConnection = null; 14 InputStream is = null; 15 URL url = null; 16 try { 17 url = new URL(urlString); 18 urlConnection = url.openConnection(); 19 is = urlConnection.getInputStream(); 20 BufferedInputStream bis = new BufferedInputStream(is); 21 bitmap = BitmapFactory.decodeStream(bis); 22 } catch (MalformedURLException e) { 23 e.printStackTrace(); 24 } catch (IOException e) { 25 e.printStackTrace(); 26 } 27 return bitmap; 28 } 29 30 @Override 31 protected void onPreExecute() { 32 super.onPreExecute(); 33 mProgressBar.setVisibility(View.VISIBLE); 34 } 35 36 @Override 37 protected void onPostExecute(Bitmap bitmap) { 38 super.onPostExecute(bitmap); 39 mProgressBar.setVisibility(View.GONE); 40 mImageView.setImageBitmap(bitmap); 41 } 42 }
在AsynsTask中, 只有doInBackground运行在子线程,其他方法都在主线程当中,所以其他方法可以对UI进行操作
在这里,我们使用了Java的流操作,自己对流的操作不是很熟悉,所以在这里提醒一下自己
4.模拟进度条的更新
1 class MyAsyncTask extends AsyncTask<Void , Integer, Void> 2 { 3 4 @Override 5 protected Void doInBackground(Void... params) { 6 for(int i = 0; i < 100; i++) 7 { 8 if(isCancelled()) 9 { 10 return null; 11 } 12 publishProgress(i); 13 try { 14 Thread.sleep(300); 15 } catch (InterruptedException e) { 16 e.printStackTrace(); 17 } 18 } 19 return null; 20 } 21 22 @Override 23 protected void onProgressUpdate(Integer... values) { 24 super.onProgressUpdate(values); 25 if(isCancelled()) 26 { 27 return; 28 } 29 mProgressBar.setProgress(values[0]); 30 } 31 } 32 33 @Override 34 protected void onPause() { 35 super.onPause(); 36 if(myAsyncTask != null && myAsyncTask.getStatus() == AsyncTask.Status.RUNNING) 37 { 38 myAsyncTask.cancel(true); 39 } 40 }