首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android多线程-AsyncTaskyi(一)

今天分析android异步线程类HandlerThread与IntentService,它们都是android系统独有的线程类,而android中还有另一个比较重要异步线程类AsyncTask。...是一种轻量级异步任务类,它可以在线程池中执行后台任务,然后会把执行进度和最终结果递给主线程并更新UI。...此外doInBackground方法会将计算返回结果递给onPostExecute方法。...ok~,最后看看我们运行结果: image.png   效果符合预期,通过这个案例,相信我们对AsyncTask使用已相当清晰了。...一般使用AsyncTask内部提供线程池即可(也可以自己创建),第二个参数,就是最终会传递给doInBackground方法可变参数,这里不,所以直接给了空白符。

63220

AsyncTask

文章目录 一、什么是AsyncTask 二、AsyncTask使用方法 三、AsyncTask内部原理 四、AsyncTask注意事项 1、内存泄漏解决方案 2、生命周期 3、结果丢失 4、并行...or 串行 一、什么是AsyncTask 1、本质上就是一个封装了线程池和handler异步框架 二、AsyncTask使用方法 1、三个参数 params是执行AsyncTask时需要传入参数...1、内存泄漏解决方案 1)、内部类使用静态内部类; 2)、进来外部activity使用弱引用; 3) 、在AcitvityonDestory() 方法中取消线程调用AsyncTask.cancel...(); 2、生命周期 1)、如果没有在activityonDestory() 方法中取消线程调用AsyncTask.cancel(),可能会导致系统不稳定; 3、结果丢失 当系统内存不足,活着屏幕旋转...,使得Activity重新创建,而AsyncTask中持有的是原activity 引用,在线程执行结束后要更新界面时,原activity已经没了。

29130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android 多线程-----AsyncTask详解

    当我们通过某个组件来启动另一个组件时候,这个时候默认都是在同一个线程当中完成。当然,我们可以自己来管理我们Android应用线程,我们可以根据我们自己需要来给应用程序创建额外线程。...我们可以将耗时操作放在异步任务当中来执行,并随时将任务执行结果返回给我们UI线程来更新我们UI控件。通过AsyncTask我们可以轻松解决多线程之间通信问题。...UI线程结果类型  我们在定义一个类继承AsyncTask时候,必须要指定好这三个泛型类型,如果都不指定的话,则都将其写成Void,例如: AsyncTask 接下来我们来看看我们Activity代码: public class MainActivity extends Activity {

    54230

    AsyncTask 相关问题

    什么是AsyncTask AsyncTask内部封装了Thread和Handler,可以让我们在后台进行计算或者把计算结果及时更新到UI上。...,而 Result 则表示后台任务返回结果类型,如果 AsyncTask 不需要 递具体参数,那么这三个泛型参数可以用 Void 来代替。...AsyncTask生命周期问题 一个在 Activity 中创建 AsyncTask 不会随着 Activity 销毁而销毁。...AsyncTask内存泄漏问题 如果 AsyncTask 被声明为 Activity 非静态内部类,那么 AsyncTask 会保留一个 对 Activity 引用。...AsyncTask结果丢失问题 屏幕旋转或 Activity 在后台被系统杀掉等情况会导致 Activity 重新创建,之前运行 AsyncTask 会持有一个之前 Activity 引用,这个引用已经无效

    58100

    Android多线程:AsyncTask使用教程(含实例讲解)

    作用 实现多线程 在工作线程中执行任务,如 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间通信,即:将工作线程执行结果递给主线程,从而在主线程中执行相关UI操作 从而保证线程安全...使用时注意点 在使用AsyncTask时有一些问题需要注意: 7.1 关于 生命周期 结论 AsyncTask不与任何组件绑定生命周期 使用建议 在Activity 或 Fragment中使用...AsyncTask时,最好在Activity 或 FragmentonDestory()调用 cancel(boolean); 7.2 关于 内存泄漏 结论 若AsyncTask被声明为Activity...非静态内部类,当Activity需销毁时,会因AsyncTask保留对Activity引用 而导致Activity无法被回收,最终引起内存泄露 使用建议 AsyncTask应被声明为Activity...静态内部类 7.3 线程任务执行结果 丢失 结论 当Activity重新创建时(屏幕旋转 / Activity被意外销毁时后恢复),之前运行AsyncTask(非静态内部类)持有的之前Activity

    80220

    译文:Android中糟糕AsyncTask

    生命周期 关于AsyncTask存在一个这样广泛误解,很多人认为一个在ActivityAsyncTask会随着Activity销毁而销毁。然后事实并非如此。...详细请参考细话Java:”失效”private修饰符,由于AsyncTask生命周期可能比Activity长,当Activity进行销毁AsyncTask还在执行时,由于AsyncTask持有Activity...结果丢失 另一个问题就是在屏幕旋转等造成Activity重新创建时AsyncTask数据丢失问题。...实际上是结果依据API不同而不同。 在1.6(Donut)之前: 在第一版AsyncTask,任务是串行调度。一个任务执行完成另一个才能执行。...由于串行执行任务,使用多个AsyncTask可能会带来有些问题。所以这并不是一个很好处理异步(尤其是需要将结果作用于UI试图)操作方法。

    61010

    asynctask使用_androidstudiohelloworld教程

    同时这不是一个通用多线程编程框架,他被设计为用于能够在 最多几秒时间内返回结果任务。...,具体对应三个 Params 执行时发送给任务参数类型 Progress 后台执行过程进度类型 Result 执行结果返回值类型 当不需要这些参数时候可以设置为...由于不太方便录屏和gif图,我这里就简单说下会发生事情:进度框会再度弹出,这没什么问题,但是进度条会停留在0%不动,直到一段时间之后弹出Toast显示下载完成,接着进度条开始慢慢增加,当达到百分之百时再次弹出...而AsyncTask生命周期和Activity是无关,那么当Activity被finish后,AsyncTask依然存在,而他持有着Activity引用导致Activity无法被垃圾回收。...同时如果使用了非静态匿名内部类来实现AsyncTask,由于Java内部类特点,他同样会持有当前Activity引用造成内存泄漏。

    32920

    Android 多线程:这是一份详细AsyncTask使用教程

    作用 实现多线程 在工作线程中执行任务,如 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间通信,即:将工作线程执行结果递给主线程,从而在主线程中执行相关UI操作...使用时注意点 在使用AsyncTask时有一些问题需要注意: 7.1 关于 生命周期 结论 AsyncTask不与任何组件绑定生命周期 使用建议 在Activity 或 Fragment中使用...AsyncTask时,最好在Activity 或 FragmentonDestory()调用 cancel(boolean); 7.2 关于 内存泄漏 结论 若AsyncTask被声明为Activity...非静态内部类,当Activity需销毁时,会因AsyncTask保留对Activity引用 而导致Activity无法被回收,最终引起内存泄露 使用建议 AsyncTask应被声明为Activity...静态内部类 7.3 线程任务执行结果 丢失 结论 当Activity重新创建时(屏幕旋转 / Activity被意外销毁时后恢复),之前运行AsyncTask(非静态内部类)持有的之前Activity

    1.2K30

    【Android开发进阶系列】多线程专题

    ),它可以在线程池中执行后台任务,然后把执行进度和最终结果递给主线程并在主线程中更新UI。         ...任务一旦完成就可以通过return语句来将任务执行结果进行返回,如果AsyncTask第三个泛型参数指定是Void,就可以不返回任务执行结果。...mWorker中call()方法执行了耗时操作,即result = doInBackground(mParams);,然后把执行得到结果通过postResult(result);,传递给内部Handler...,那么AsyncTask会保留一个对创建了AsyncTaskActivity引用。...3) 结果丢失         屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity重新创建,之前运行AsyncTask(非静态内部类)会持有一个之前Activity引用,这个引用已经无效

    46730

    AsyncTask解析

    概述 AsyncTask是一个抽象类,它是Android封装一个轻量级异步操作类。它可以在线程池中执行后台任务,然后把执行进度和最终结果传递到主线程,并在主线程中更新UI。...在mWorker call()方法中,会调用 doInBackground()执行耗时任务,并将执行结果通过 postResult(result)传递给内部Handler跳转到主线程中。...AsyncTask使用不当后果 1. 内存泄漏 如果AsyncTask被声明为Activity非静态内部类,那么AsyncTask会保留一个对创建了AsyncTaskActivity引用。...如果Activity已经被销毁,AsyncTask后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。...结果丢失 屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity重新创建,之前运行AsyncTask(非静态内部类)会持有一个之前Activity引用,这个引用已经无效,这时调用

    59010

    AsyncTask源码分析

    AsyncTask是android为我们提供执行异步任务一个轻量类,可以用来处理耗时操作,并且能够很方便将执行结果返回给主线程。本篇文章将会通过源码分析来介绍AsyncTask内部实现原理。...这个params我们知道它是我们进来参数,但是sDefaultExecutor是什么呢?它是一个线程池,是一个类成员变量。...图解AsyncTask执行过程 要想知道执行结果是如何被传递到线程中,我们先搞明白AsyncTask执行过程。其实读者从上面的内容中或许能改猜到它大概执行过程。...结合上面的执行流程图我们知道,在经过上面7个步骤异步任务一个一个在线程池中被完成。既然我们知道了AsyncTask大致执行过程,那么它是如何将执行结果返回到主线程呢?下面我们将会来分析。...当call()方法在执行完doInBackground()方法得到结果后,会将该结果递给postResult()方法: private Result postResult(Result result)

    78320

    Android查缺补漏(线程篇)-- AsyncTask使用及原理详细分析

    ,可以很方便在线程池中执行异步任务,并且将进度和结果递给主线程。...: Parmas:参数类型 Progress:异步任务执行进度类型 Result:异步任务执行完毕后返回结果类型 在使用AsyncTask执行异步任务需要创建一个类,让这个类继承AsyncTask,.../cn.codingblock.thread I/MyAsyncTask: onPostExecute: result=执行结果:100.0% 2、多个AsyncTask对象在执行异步任务时,默认是串行执行...} else { onPostExecute(result); // 任务完成后就将执行结果递给onPostExecute方法 } mStatus = Status.FINISHED...} else { onPostExecute(result); // 任务完成后就将执行结果递给onPostExecute方法 } mStatus = Status.FINISHED

    56430

    android异步消息机制 从源码层面解析(2)

    AsyncTask 什么是AsyncTask AsyncTask是一个轻量级异步任务类,它可以在线程池中执行后台任务,然后把执行进度和结果递给主线程并在主线程中更新UI。...,它输入参数为图片url地址,后台进程参数为Integer类型,后台任务返回结果为bollean类型。...另一个是FutureTask,它参数就是前面创建WorkerRunnable对象。 接下来我们再看AsyncTaskexecute()方法,这个方法是整个异步任务入口。...AsyncTask构造函数进来第一个参数,传入到doInBackground(mParams)中 mWorker.mParams = params; //******************...就是Callable c = callable;里进来callable,而callable就是我们最开始在AsyncTask构造方法里进来WorkerRunnable,所以接着就该看看WorkerRunnable

    53021

    AsyncTask源码分析(Android7.0)

    在这里WorkerRunnable作为参数传递给了FutureTask。这两个变量会暂时保存在内存中,稍后会用到它们。 当要执行AsyncTask时,需要调用它execute方法,代码如下所示。...这里会首先调用 onPreExecute方法,在注释1处将AsyncTask参数传给WorkerRunnable,从前面我们知道WorkerRunnable会作为参数传递给了FutureTask,因此...接下来会调用execexecute方法,并将mFuture也就是前面讲到FutureTask进去。...这里exec是进来参数sDefaultExecutor,它是一个串行线程池,它代码如下所示。 ?...如果AsyncTask任务被取消了则执行onCancelled方法,否则就调用onPostExecute方法。而正是通过onPostExecute方法我们才能够得到异步任务执行后结果

    768100

    androidAsyncTask应用

    1 ) AsyncTask实现原理 AsyncTask,是android提供轻量级异步类,可以直接继承AsyncTask,在类中实现异步操作 使用优点:简单,快捷,过程可控 使用缺点:...在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现原理 在Handler 异步实现时,主要是主线程启动Thread(子线程)并生成Message,传递给Handler...Integer,更新之后数值是Integer,最后结果是字符串String private class ChileUpdate extends AsyncTask<Integer, Integer...任务一旦完成就可以通过return 语句来将任务执行结果返回,如果AsyncTask * 第三个泛型参数指定是Void,就可以不返回任务执行结果。...* 返回数据会作为参数传递到此方法中,可以利用返回数据来进行一些UI 操作, * 比如说提醒任务执行结果,以及关闭掉进度条对话框等。

    42930

    Android查缺补漏(线程篇)-- AsyncTask使用及原理详细分析

    ,可以很方便在线程池中执行异步任务,并且将进度和结果递给主线程。...: Parmas:参数类型 Progress:异步任务执行进度类型 Result:异步任务执行完毕后返回结果类型 在使用AsyncTask执行异步任务需要创建一个类,让这个类继承AsyncTask,.../cn.codingblock.thread I/MyAsyncTask: onPostExecute: result=执行结果:100.0% 2、多个AsyncTask对象在执行异步任务时,默认是串行执行...} else { onPostExecute(result); // 任务完成后就将执行结果递给onPostExecute方法 } mStatus = Status.FINISHED...} else { onPostExecute(result); // 任务完成后就将执行结果递给onPostExecute方法 } mStatus = Status.FINISHED

    1.1K70

    来聊聊Android多线程

    答:其实除了Activity,其它组件也都在主线程。这就意味着如果在其他组件中做耗时操作的话,同样会另主线程阻塞。 问题3:当有耗时操作时,一般怎么处理?...线程间交互 我们假设一个经常发生场景,某个前台UI需要通过服务器获取数据,比如获取今天天气情况。 有开发经验同学立马就知道必须开子线程去进行网络操作,再通过线程间交互把数据回。...我们贴两段简单代码吧~ (1)AsyncTask AsyncTask getWeatherTask = new AsyncTask() { @Override protected Object...AsyncTask原理其实也是用Looper + Handler方式,在子线程进行耗时操作,再把结果返回到主线程,在onPostExecute中处理。...问题来了 Thread例子代码里,如果我们不给Handler构造方法参数是不是可以呢? 其实得看情况, · 如果是在主线程创建handler,那没问题 · 如果是在子线程,则会抛出异常

    31820

    Android查缺补漏(线程篇)-- AsyncTask使用及原理详细分析

    ,可以很方便在线程池中执行异步任务,并且将进度和结果递给主线程。...: Parmas:参数类型 Progress:异步任务执行进度类型 Result:异步任务执行完毕后返回结果类型 在使用AsyncTask执行异步任务需要创建一个类,让这个类继承AsyncTask,.../cn.codingblock.thread I/MyAsyncTask: onPostExecute: result=执行结果:100.0% 2、多个AsyncTask对象在执行异步任务时,默认是串行执行...} else { onPostExecute(result); // 任务完成后就将执行结果递给onPostExecute方法 } mStatus = Status.FINISHED...} else { onPostExecute(result); // 任务完成后就将执行结果递给onPostExecute方法 } mStatus = Status.FINISHED

    58920

    Android 多线程几种方式

    )参数类型 第二个String代表处理过程中参数类型,也就是doInBackground()执行过程中产出参数类型,通过publishProgress()发消息 传递给onProgressUpdate...如果您App没有明确指定屏幕方向和configChanges时,当用户旋转屏幕时候Activity就会重新启动,而这个时候您异步加载数据线程可能正在请求网络。...当一个新Activity被重新创建之后,就又重新启动了一个新任务去请求网络,这样之前一个异步任务不经意间就泄露了,假设你还在onPostExecute写了一些其他逻辑,这个时候就会发生意想不到异常...Android会在销毁你Activity之前调用onSaveInstanceState()方法,于是,你可以在此方法中存储关于应用状态数据。...但是,对于AsyncTask怎么办?问题产生根源在于Activity销毁重新创建过程中AsyncTask和之前Activity失联,最终导致一些问题。

    81720

    使用AsyncTask异步更新UI界面及原理分析

    通常在这里执行耗时后台计算。计算结果必须由该函数返回,并被传递到onPostExecute()中。...后台计算结果会被作为参数传递给这一函数。...5、取消任务:onCancelled (),在调用AsyncTaskcancel()方法时调用 AsyncTask构造函数有三个模板参数: 1.Params,传递给后台任务参数类型。...2.Progress,后台计算执行过程中,进步单位(progress units)类型。(就是后台程序已经执行了百分之几了。) 3.Result, 后台执行返回结果类型。...总结:1、 AsyncTask本质是一个静态线程池,AsyncTask派生出子类可以实现不同异步任务,这些任务都是提交到静态线程池中执行。

    1.4K110
    领券