为了账号安全,请及时绑定邮箱和手机立即绑定

Android必学-AsyncTask基础

难度中级
时长49分
学习人数
综合评分9.77
206人评价 查看评价
9.8 内容实用
9.9 简洁易懂
9.6 逻辑清晰
  • AsyncTask四个方法:onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute()。 四个方法中只有doInBackground()运行在其他线程,而其他都运行在主线程。所以其他3个方法都可以更新UI,而只有doInBackground()需要做异步处理,并且不可以直接更新UI。 另外,安卓提供的onPostExecute()和onPregressUpdate()方法来承接了异步处理的操作,从而能够在异步处理的过程中,去更新UI,这也是AsyncTask所简化、所封装的非常好的方面。
    查看全部
    0 采集 收起 来源:总结

    2017-04-06

  • doInBackground:所有耗时操作都要在此完成
    查看全部
  • AsyncTask四个方法:onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute()。 四个方法中只有doInBackground()运行在其他线程,而其他都运行在主线程。所以其他3个方法都可以更新UI,而只有doInBackground()需要做异步处理,并且不可以直接更新UI。 另外,安卓提供的onPostExecute()和onPregressUpdate()方法来承接了异步处理的操作,从而能够在异步处理的过程中,去更新UI,这也是AsyncTask所简化、所封装的非常好的方面。
    查看全部
    1 采集 收起 来源:总结

    2017-03-20

  • 反复执行上一节课的异步加载,而且是不等进度条满就后退再执行,会发现后面执行的进度条迟迟没有响应,为什么呢?这并非bug,而是 AsyncTask 所实行的一种机制。AsyncTask的底层是通过线程池去作用的。当一个线程没有完成的时候,后面的线程就无法开始。我们上一节课用了for()循环去执行进度条 的更新操作,必须等到for()循环结束后才会执行下一个Task。 --------- 那么,如何去解决这样的问题呢? 很简单,令AsyncTask的生命周期和Activity或者Fragment的生命周期保持一致就可以了。 回到ProgressBar,重写onPause(),在Activity执行onPause()的时候,对AsyncTask进行判断: 如果AsyncTask不为空且处于Running状态,我们就要取消该线程: protected void onPause() { super.onPause(); if(mTask!=null && mTask.getStatus()==AsyncTask.Status.RUNNING){ mTask.cancel(true); } } cancle()方法只是将对应的AsyncTask标记为cancel状态,并不是真正地取消线程的执行。 另外,我们在Java中也是没办法直接粗暴地停止一个线程,我们必须要等一个线程执行完毕之后才能继续其他线程的操作。 -------------- 那要如何快速停止线程呢? 1. 在onPause()中标记取消状态:mTask.cancel(true); 既然我们已经标记了cancel状态,那么可以在AsyncTask中监测这样的改变,一旦当前状态改为cancelled,我们就要跳出循环,立刻结束当前操作,从而结束整个线程逻辑。 2. 在doInBackground()方法的for()循环内添加isCancelled()对线程的状态进行判断: if(isCancelled())break; 3. 同理,在onProgressUpdate()方法中也做类似的处理: if(isCancelled())return; 通过如上操作,我们就能快速停止当前线程,将处理权交给下一个AsyncTask。
    查看全部
  • 创建内部类 MyAsyncTask 继承 AsyncTask: 1. MyAsyncTask extends AsyncTask<Void,Integer,Void>,因为这里不需要URL路径也不需要返回值,只需要传进一个更新进度分参数类型,这里指定为整型。 2. 通过for循环设置进度值,但是如何将进度传递给ProgressBar呢?当然是通过publishProgress();此方法可以传递一个Integer类型的参数。 3. 通过publishProgress(i)将for循环的i传出之后,还需要设置一个方法接收i,这个方法就是onProgressUpdate(Integer... values),明显可以看出该方法传进的是Integer类型的参数。注意这里的values是一个数组,我们真正需要的是values[0],这才是传进来的进度值。再通过mProgressBar.setProgress(values[0]);将values[0]设置为当前进度值。 4. 定义一个MyAsyncTask(属于ProgrssBar的)对象myTask,并在onCreate()方法中进行实例化。调用mTask的execute()方法启动异步加载,这里的execute()无需参数。 流程: 1. execute()启动异步加载; 2. doInBackground的for循环模拟进度的更新(publishProgress(i));并添加了线程睡眠以便观察(Thread.sleep(300))。 3. onProgressUpdate()获取进度的更新值;这样我们可以在UI线程中获得异步线程实时传递的进度更新值,用来更新我们的ProgressBar。 其他操作: 1. 在activity_main.xml中添加新的Button、新的点击事件。 2. 将ProgressBarTest部署到MainActivity: public void loadProgress(View view){ startActivity(new Intent(this,ProgressBarTest.class)); } 3. 配置文件ActivityManifest: <activity android:name=".ProgressBarTest"/>
    查看全部
  • 调用异步操作的流程: 我们在主线程中创建MyAsyncTask的实例,调用execute()方法,就可以开启AsyncTask异步线程操作。 1. 在ImageTask.java的onCreate()方法中创建内部类MyAsyncTask对象,调用该对象的execute()方法,该方法开启异步线程的操作,execute()传进一个或多个参数,作为doInBackground(String... params)的参数。 2. onPreExecute()对整个异步操作做一些初始化操作,这里是显示进度条,提示用户等待。 3. doInBackground()做真正的异步操作处理,做任意的耗时操作,并返回指定的类型。 4. onPostExecute()获取异步操作的返回结果,由于onPostExecute()运行在主线程,方便我们操作UI,而这里的例子就是设置ImageView。 ----------------- 其他事项: 1. 在配置文件AndroidManifest.xml 中添加Activity: <activity android:name=".ImageTest" /> 并设置网络权限: <uses-permission android:name="android.permission.INTERNET"></uses> 2. 如果网速太给力,为了看到异步加载的效果,我们需要人为地增加时间。。。在doInBackgroung()中添加一句线程休眠操作: Thread.sleep(3000); 此方法需要捕捉异常。 3. 增加点击事件:在activity_main.xml中添加一个Button,直接在Buttonn中添加属性: android:onClick="loadImage",就声明了点击事件,然后在MainActivity中创建该方法: //点击事件 public void loadImage(View view){ startActivity(new Intent(this,ImageTest.class));//Activity之间的通信 } 该方法在onCreate()外面。
    查看全部
    0 采集 收起 来源:与UI线程通信

    2018-03-22

  • AsyncTask<String,Void,Bitmap>三个参数分别为:url类型,进度值类型,返回值类型。 这里的例子暂时不设置进度值,url设置为String类型,又因为我们加载的是一张Bitmap,所以返回的参数类型设置为 Bitmap。 1. doInBackground(String...params)传进来的是一个可变长数组,也就是说,我们可以传进不止一个参数(通过execute()传进来),这些参数依次存在于这个数组中。现在只有一个参数,所以只要写个params[0]取出对应的URL即可。 2. 定义一个Bitmap,也就是我们所要获取的Bitmap。 3. 定义一个访问网络的URLconnection,也就是一个网络连接对象connection。 4. 定义一个InputStream,用于获取数据的输入流。 5. 初始化connection:connection = new URL(url).openConnection();这里需要自行导入jar包:import java.net.URL; 另外需要try-catch包围。 6. 获取输入流:is = connection.getInputStream(); 7. 对输入流进行包装:BufferedInputStream bis = new BufferedInputStream(is); 8. 通过decodeStream()将输入流解析成 Bitmap:bitmap = BitmapFactory.decodeStream(bis); 9. 关闭输入流、返回 bitmap。
    查看全部
    0 采集 收起 来源:创建AsyncTask类

    2018-03-22

  • 网络操作作为一种不稳定的耗时操作,从4.0开始就严禁放入主线程中。 所以去显示一张网络图片的时候,我们需要在异步处理中下载图像,在UI线程(主线程)中去设置图像。 --------------- 本节课的步骤: 1. 创建image.xml,放置ImageView和ProgressBar; 2. 创建Image.java,继承Activity类,重写onCreate(),加载image.xml做为视图(setContentView(R.layout.image);)。 创建并初始化ImageView、ProgressBar。另外附上网络图片的URL地址: private static String URL = "http://img.my.csdn.net/uploads/201504/12/1428806103_9476.png";
    查看全部
    0 采集 收起 来源:AsyncTask创建UI

    2018-03-22

  • 构建AsyncTack子类的参数 AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数: params:启动任务时输入参数的类型。 progress:后台任务执行中,返回进度值的类型。 Result:后台执行任务完成后,返回结果的类型。 ------------------------ 如何构建AsyncTask子类的回调方法? 一个完整的AsyncTask通常需要指定如下几个方法: 1. doInBackground:这是AsyncTask子类所必须要重写的方法,异步执行后台线程将要完成的任务。我们所有的耗时操作都将在这个方法中进行操作。 2. onPreExecute:执行后台耗时操作之前被调用,通常是用户完成一些初始化操作。 3. onPostExecute:当doInBackground()完成后,系统会自动调用此方法,并将doInBackground()返回的值传给该方法,也就是展示处理完成的结果。 4. onProgressUpdate:在doInBackground()方法中调用publishProgrsss()更新任务的执行进度后,就会触发该方法(必须先调用publishProgrsss()),就可以知道当前耗时操作的完成进度。 ---------------------------------- 额外补充: 1. 注意这里的例子继承的是 AsyncTask<Void,Void,Void>,需要带上三个泛型,定义Void泛型要注意V是大写。。。 2. 执行顺序:onPrRreExecute() --> doInBackground() --> onProgressUpdate() --> onPostExecute()。
    查看全部
  • 异步任务——AsyncTask 为什么要异步任务? Android中只有主线程(也就是UI线程)可以对UI进行操作,其他线程不能对UI进行操作。这样做的好处自然是保证UI的稳定性和准确性,避免了多线程同时对UI进行操作而造成的混乱。 AsyncTask为何而生? 但同时Android又是一个多线程的操作系统,我们不可能把所有的事情都放在主线程中去实现,比如一些网络操作、读取文件这样的耗时操作,如果都放在主线中执行,就会造成后面任务的阻塞。Android系统会检测这样的阻塞,当阻塞时间太长的时候,系统就会抛出ANR异常(无响应)。所以我们要把耗时操作放在非主线中去执行,这样既保证Android的单线程模型,又防止出现ANR。 提到异步任务,我们能想到用线程,线程池去实现.确实,Android给我们提供了主线程与其他线程通讯的机制.但同时,Android也给我们提供了一个封装好的组件--AsyncTask.利用AsyncTask,我们可以很方便的实现异步任务处理.AsyncTask可以在子线程中更新UI,也封装简化了异步操作.使用线程,线程池处理异步任务涉及到了线程的同步,管理等问题.而且当线程结束的时候还需要使用Handler去通知主线程来更新UI.而AsyncTask封装了这一切,使得我们可以很方便的在子线程中更新UI.
    查看全部
    0 采集 收起 来源:AsyncTask概述

    2017-03-19

  • 回调方法
    查看全部
  • 内部类MyAsyncTask的三个泛型分别是String,Void,Bitmap
    查看全部
    0 采集 收起 来源:创建AsyncTask类

    2017-03-01

  • 当我们在doInBackground()方法中调用publishProgress()方法的时候,就可以将一个进度值以参数的形式传递给publishProgress(),这样在onProgressUpdate()我们可以就获取到这样一个参数,从而用于更新一个异步线程的完成进度
    查看全部
  • Void是空类型
    查看全部
  • 所有的耗时操作都将在doInBackground这个方法中完成
    查看全部

举报

0/150
提交
取消
课程须知
本课程是Android初级课程 1、掌握基本的Android应用程序开发方法 2、掌握AsyncTask中个方法中参数的意义 3、掌握AsyncTask中4个常用的方法
老师告诉你能学到什么?
1、了解Android的单线程模型 2、 AsyncTask的基本构成 3、 AsyncTask的回调方法 4、 AsyncTask实例

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!