Android-异步加载AsynsTask

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-异步加载AsynsTask相关的知识,希望对你有一定的参考价值。

   我们知道,在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     }

  

 

以上是关于Android-异步加载AsynsTask的主要内容,如果未能解决你的问题,请参考以下文章

当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?

当活动中的异步任务完成时如何在片段中重新加载ui?

如何延迟或异步此 WordPress javascript 片段以最后加载以加快页面加载时间?

android webview不加载片段

用于数据加载的 Android 活动/片段职责

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段