从上面源码我们可以看到,一个AsyncTask实例任务只能运行一次,只有是在PENDING状态下,任务才能正常运行,否则就会抛出异常。...} else { onPostExecute(result); // 任务完成后就将执行结果传递给onPostExecute方法 } mStatus = Status.FINISHED...} else { onPostExecute(result); // 任务完成后就将执行结果传递给onPostExecute方法 } mStatus = Status.FINISHED...前面所说的这个FutureTask任务是在AsyncTask初始化时被封装好的,在该任务中调用了doInBackground方法用于异步执行我们添加的耗时任务,doInBackground方法执行完毕会通过...InternalHandler将返回结果发送到onPostExecute中,该方法是运行在主线程中。
2) AsyncTask的doInBackground(mParams)方法执行异步任务运行在子线程中,其他方法运行在主线程中,可以操作UI组件。...3) 不要手动的去调用AsyncTask的onPreExecute, doInBackground, onProgressUpdate, onPostExecute方法,这些都是由Android系统自动调用的一个任务...4) 运行中可以随时调用cancel(boolean)方法取消任务,如果成功调用isCancelled()会返回true,并且不会执行onPostExecute() 方法了,取而代之的是调用 onCancelled...Android会在销毁你的Activity之前调用onSaveInstanceState()方法,于是,你可以在此方法中存储关于应用状态的数据。...然后你可以在onCreate()或onRestoreInstanceState()方法中恢复。 但是,对于AsyncTask怎么办?
* 在主线程中执行,在异步任务执行之前,该方法将会被调用 * 一般用来在执行后台任务前对UI做一些标记和准备工作, * 如在界面上显示一个进度条。...是可以选择性覆写的方法 * 在主线程中执行,在异步任务执行完成后,此方法会被调用 * 一般用于更新UI或其他必须在主线程执行的操作,传递参数bitmap为 * doInBackground...此外doInBackground方法会将计算的返回结果传递给onPostExecute方法。...(4)onPostExecute(Result), 在主线程中执行,在doInBackground 执行完成后,onPostExecute 方法将被UI线程调用,doInBackground 方法的返回值将作为此方法的参数传递到...方法将会被执行,最后doInBackground方法执行后完后,onPostExecute方法将被执行。
使用 使用时首先需要新建一个类,继承自AsyncTask, 泛型要填包装类,或者自定义的Model类型, 系统要求至少一定要继承doInBackground()这个方法, 即在后台子线程进行的一个方法...public class DownloadAsyncTask extends AsyncTask { /** * 方法执行在异步任务之前...public class DownloadAsyncTask extends AsyncTask { /** * 方法执行在异步任务之前...(aBoolean); } /** * 本方法运行在主线程 * 进度变化就在这个方法处理 * 接收来自 doInBackground...、onPostExecute)和onCancelled()方法 AsyncTask对象必须在主线程创建; 开始和结束异步任务的方法: execute(Params...params) 必须在主线程中调用
doInBackground(Params...) 这个方法在 子线程中运行,应该在这里处理所有的耗时任务。 任务执行结束,可以通过 return语句来返回任务执行的结果。...当在后台任务中调用 publishProgress(Progress…)后,这个方法就会马上被调用,方法中携带的参数是后台任务传过来的,该方法在 主线程运行,所以可以进行UI更新。...返回的数据会被作为该方法的参数传递过来,该方法是在 主线程中运行,可以利用返回的数据进行UI更新操作,如提醒任务执行的结果或关闭掉进度条对话框等。...还提供了 onCancelled()方法,该方法运行在 主线程,当异步任务取消时,该方法就会被调用,这个时候 onPostExecute(Result)就不会被调用。...结果丢失 屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask(非静态的内部类)会持有一个之前Activity的引用,这个引用已经无效,这时调用
能够通过getStatus()方法返回线程的工作状态,如“PENDING,RUNNING,FINISHED”分别表示“准备中,运行中,已完成”。...(Long result) { showDialog("Downloaded " + result + " bytes"); } } ---- 先说重写的方法: onPreExecute() 这个方法会在后台任务开始执行之前调用...doInBackground(URL... urls) 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。...以及URL-->doInBackground(URL)-->return Long-->onPostExecute(Long),进行结果展示 要启动的时候,使用下方语句即可 new DownloadFilesTask...().execute(); 这是第一个坑 当内部子线程运行完毕,则AsyncTask进入onPostExecute()方法,然后状态变为FINISHED,再次调用不可 而cancel()这方法就更不可思议了
doInBackground() 方法在 onPreExecute()执行完成后调用的。doInBackground()这个方法用于执行可能需要很长时间的首台计算。异步任务的参数被传递到这个步骤中。...onPostExecute()方法, 后台任务完成后,在UI线程调用onPostExecute()方法,后台运行的结果作为参数传递给这个方法 取消任务 在任何时候都可以通过调用cancel(boolean...调用此方法后,在执行doInBackground(Object [])方法后,将调用onCancelled(object),而不是onPostExecute(Object)方法。...在doInBackground()设置成员字段,并在onProgressUpdate()和onPostExecute()方法中引用他们。 执行顺序。...* * @see #onPostExecute * @see #doInBackground */ // 在调用doInBackground()方法之前
不应该运行在独立的进程中吗?就算运行在主进程中那不应该运行在后台线程中吗? 文档中确实提醒过不要在主线程中进行耗时操作,那为什么在主线程中读写文件没有问题?甚至连警告都没有?...异步 Android 中的异步操作基本都是使用 Java 语言内置的,唯一的简单封装的异步类 AsyncTask 有几个主要回调,我们可以通过这些回调指定那些代码在异步任务开始之前执行,哪些代码在异步任务中执行...,哪些代码在任务执行完成后执行: static class Task extends AsyncTask { String taskDesc; public...如果你一定要并行执行,需要使用 executeOnExecutor() 方法并使用类似 AsyncTask.THREAD_POOL_EXECUTOR这样的线程池去执行任务。...是的,在动画执行结束之前,如果你退出了 Activity,这个 View 的动画不会被终止,因此这个已经退出的 Activity 也不会被回收 还有一种比较有趣的用例是,在使用单例的时候你无意或者有意引用了
方法)开始之前调用,用于一些初始化的操作 doInBackground(Void…) : 这个方法就是在后台进行的耗时操作的方法,里面的所有代码都会在Android新建的一个子线程中运行,并且这个方法不可以进行...这个方法的返回值会传递给onPostExecute方法用于收尾 onProgressUpdate(Interge…) : 这个方法里进行UI的更新,当在doInBackground方法中调用了publishProgress...方法之后,就会调用这个方法来及时的进行UI更新 onPostExecute(Boolean result) : 这个方法用于收尾,当doInBackground方法执行完成之后就会调用这个方法,主要是对于操作进行判断是否成功...用于进度的UI更新),第三个参数的参数类型为onPostExecute方法的参数类型,并且也是doInBackground方法返回值类型(这里传入Boolean用于判断执行的结果),当然,我们可以根据自己的需要来传入对应的参数类型...并且LogCat 中打印的信息中我们可以发现 MyAsyncTask 和 MainActivity 确实不是在同一个线程之中(MyAsyncTask 的 doInBackground 方法在子线程中执行
doInBackground(Params...) 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。...thread is main 可以看到除过 doInBackground 方法外其他的方法都是在主线程中执行的。...()方法中去执行具体的下载逻辑,在onProgressUpdate()方法中显示当前的下载进度,在onPostExecute()方法中来提示任务的执行结果。...Handle 做的线程切换,所以 onPostExecute 方法内部逻辑也是在主线程执行的。...Thread.interrupt()方法不会中断一个正在运行的线程。 这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出 阻塞的状态。
方法执行在UI线程,会在做后台任务之前调用,可以在这里执行一些初始化操作,例如上面的显示Dialog doInBackground 改方法执行在后台线程,任务中的耗时操作都应该在这里执行,AsyncTask...onProgressUpdate 在publishProgress方法后,系统会调用该方法,该方法运行在UI Thread,所以可以在这里做UI更新的操作,比如更新ProgressDialog的进度。...onPostExecute 在doInBackground方法执行完成后会执行该方法,同样运行在UI Thread。...doInBackground方法之前调用,并且是在UI Thread onPreExecute(); /** *具体执行方法在这里 我们直到这个exec就是上一步传进来的...区别在于调用这个方法后,doInBackground执行完成时会调用onCancelled方法,而不是onPostExecute方法,所以cancel无法保证任务能够被取消 内存泄漏 上面的示列代码从Activity
onPreExecute、doInBackground、publishProgress、onPostExecute、onProgressUpdate、onCancelled是AsyncTask的几个关键方法...除了doInBackground在异步线程执行外,publishProgress可在任意线程处理,其他方法都是在UI线程处理。...从executeOnExecutor方法里可以看出,一开始执行Status状态就置成了RUNNING运行状态,这里出现了关键方法之一 onPreExecute,也就是执行异步任务doInBackground...官方释义:这是一个可以取消的异步计算,该类提供了Future的基本实现,具有启动和取消运算,查询运算是否结束,并且检查返回计算的结果,该结果只能在运行完成之后才能获取到,如果程序没有运行结束,则get(...在执行可能很长时间阻塞的操作之前调用此功能是有用的,以确保任何挂起的对象引用已被释放,以防止进程对对象持有比它所需时间更长的时间。这里不做深究。异步任务执行完毕又是如何告知UI线程的呢?
onPorgressUpdate(Progress... progress) 此方法在主线程执行,当任务发生进度改变就会调用此方法,比如显示下载进度 onPostExecute(Result... result...传入参数为doInBackground的返回值. ps: 当doInBackground的线程被取消就会回调给onCancelled这个方法,此方法被调用onPostExecute就不会调用了。...总结: asynctask对象要在主线程创建,并调用execute方法 不能直接调用doinbackground方法 一个asynctask对象只执行一次 3.0之前asynctask用并行线程池执行,...,将之前的mFuture对象插入队列mTask里面,判断当前有没有任务在进行,没活动就调用schedulNext方法执行下一个asynctask任务。...的构造方法 mWork会调用call方法将mTaskInvoked设置为true,再调用doinbackground 得到返回值再调用onpostexecute方法, 在postResult方法里面会发送
该方法在 子线程 中执行 ; onPreExecute() : 在 doInBackground() 执行前先执行的方法 , 主线程 中执行 , 可更新 UI 界面 ; onProgressUpdate...() : 调用 publishProgress() 回调的方法 , 主线程 中执行 , 可更新 UI 界面 ; onPostExecute() : doInBackground() 执行完毕后再执行的方法...之前执行的方法, 一般在该方法中执行初始化操作 ( 主线程, 可以更新 UI ) super.onPreExecute(); } @Override protected...; 而在 AsyncTask 异步任务中 , 执行 doInBackground() 方法 , 该方法也是在子线程中执行的 , 可以得到该方法执行的结果 , 这个执行结果是靠 Future 接口得到的...; 在 WorkerRunnable 中的 call() 方法中执行了 doInBackground() 方法 ; 在 FutureTask 中的 done() 方法中 : 执行 postResultIfNotInvoked
而在 AsyncTask 中,比较常用的方法有: onPreExecute 、 doInBackground 、 onPostExecute 和 onProgressUpdate 等。...而上述的方法中除了 doInBackground 运行在子线程中,其他的都是运行在主线程的,相信大家对这几个方法也了如指掌了。...其中 finish 应该是在任务结束时回调的,若任务完成会回调 onPostExecute 方法,否则会回调 onCancelled 方法;而消息类型为 MESSAGE_POST_PROGRESS 中的...而在 executeOnExecutor 方法内又会去调用 onPreExecute 方法。这也就是为什么 onPreExecute 方法是在任务开始运行之前调用的原因了。...在 execute 方法中,会先去调用 onPreExecute 方法,之后再在线程池中执行 mFuture 。这时会调用 doInBackground 方法开始进行任务操作。
Android4.0之后,网络访问这些都是要放在自己开的线程里,然后在主线程里进行访问的。就我所知的有两种方法。...AsyncTask可以使得使用UI线程变的更容易更适当,它可以在后台运行一些操作然后在UI上展现,不用操作具体的线程和handlers 一个 asynchronous task包括三种基本类型(调用参数...,进度和结果),和四个步骤(调用开始,在后台运行,处理进度,结束)。...而doInBackground(Params...)是一定要实现的。 ...(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)。
首先MessageQueue是按顺序处理消息的,而在setContentView()后队列中会包含一条询问是否完成布局的消息,而我们的任务通过View#post方法被添加到队列尾部,保证了在layout...,用于获取工作线程传递过来的消息,此方法运行在UI线程上。...doInBackground(Params...) 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。 ...()方法中去执行具体的下载逻辑,在onProgressUpdate()方法中显示当前的下载进度,在onPostExecute()方法中来提示任务的执行结果。...3) 结果丢失 屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask(非静态的内部类)会持有一个之前Activity的引用,这个引用已经无效
当然执行doInBackground时你需要返回一个结果集。该结果集最终在onPostExecute中获取。...同样的原因,onPostExecute是在主线程中运行的;(线程总是切换来切换去,真烦是不是?)...; onPreExecute、onPostExecute、doInBackground、onProgressUpdate 四个方法不能在程序中直接调用; 一个AsyncTask实例只能调用一次execute...方法; AsyncTask执行execute方法时在Android1.6之前串行;Android1.6之后并行;Android3.0后串行。...在传如前先调用了onPreExecute()方法,在mFuture被执行的时候,会回调mWorker的call方法,call方法里会调用doInBackground方法,获得doInBackground
领取专属 10元无门槛券
手把手带您无忧上云