asynctask

多线程(四)、Android多线程使用及AsyncTask源码分析

半城伤御伤魂 提交于 2020-01-01 00:59:19
本篇是多线程系列的第四篇,如果对前三篇感兴趣的也可以去看看。 多线程(一)、基础概念及notify()和wait()的使用 多线程(二)、内置锁 synchronized 多线程(三)、线程池 ThreadPoolExecutor 知识点总结 除了前面的线程池的使用外,在Android中,我们除了通过 Thread 创建线程外,还可以通过 AsyncTask 、 IntentService 、 HandleThread 来创建,线程池前面一篇已经详细介绍了,下面对其他几个方法简单的介绍。 1.1、HandleThread 1.1.1、源码 public class HandlerThread extends Thread { int mPriority; int mTid = - 1 ; Looper mLooper; public HandlerThread (String name) { super (name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread (String name, int priority) { super (name); mPriority = priority; } protected void onLooperPrepared () { } @Override

Android - 关于工作线程的思考

半世苍凉 提交于 2019-12-31 19:08:06
原文地址: 「关于Android中工作者线程的思考」http://droidyue.com/blog/2015/12/20/worker-thread-in-android/ 1、AsyncTask与内存泄漏:   如果在Activity中使用非静态匿名类创建AsyncTask实例,会隐式持有Activity实例的引用;   AsyncTask源码实现中,mFuture同样使用匿名内部类创建对象实例,mFuture作为执行任务最终会加入由静态成员变量SERIAL_EXECUTOR的一个ArrayDeque类型的集合中;   当Activity需要被销毁时,处于排队的AsyncTask由于对Activity实例的引用关系,导致对应的内存不能被GC回收,出现内存泄漏; 2、AsyncTask 不好好工作的 cancel(): public final boolean cancel(boolean mayInterruptIfRunning) { mCancelled.set(true); return mFuture.cancel(mayInterruptIfRunning); }   当我们调用 cancel(false),doInBackground()仍然会执行到方法结束,结束时不会去调用onPostExecute()方法,而是调用 onCancelled()方法;  

【源码解析】AsyncTask的用法与规则

心不动则不痛 提交于 2019-12-24 10:01:13
引言 AsyncTask ,相信大家已经很熟悉了。它的内部封装了 Thread 和 Handler ,这让我们可以将一些耗时操作放到 AsyncTask ,并且能将结果及时更新到UI上。 AsyncTask 主要用于短时间耗时操作,长时间耗时操作不建议使用 AsyncTask 。下面通过Google官方的一个例子来认识 AsyncTask 的用法。 一个例子 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected void onPreExecute() { showProgress(); } protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return

Android多线程的四种方式

北城以北 提交于 2019-12-23 10:00:07
转自: https://www.jianshu.com/p/91552325f5a5 当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。通常一个应用的所有组件都运行在这一个Process中,当然,你可以通过修改四大组件在Manifest.xml中的代码块()中的android:process属性指定其运行在不同的process中。当一个组件在启动的时候,如果该process已经存在了,那么该组件就直接通过这个process被启动起来,并且运行在这个process的UI Thread中。 UI Thread中运行着许多重要的逻辑,如系统事件处理,用户输入事件处理,UI绘制,Service,Alarm等,如下图: UI Thread包含的逻辑 而我们编写的代码则是穿插在这些逻辑中间,比如对用户触摸事件的检测和响应,对用户输入的处理,自定义View的绘制等。如果我们插入的代码比价耗时,如网络请求或数据库读取,就会阻塞UI线程其他逻辑的执行,从而导致界面卡顿。如果卡顿时间超过5秒,系统就会报ANR错误。所以,如果要执行耗时的操作,我们需要另起线程执行。 在新线程执行完耗时的逻辑后,往往需要将结果反馈给界面,进行UI更新。Android的UI toolkit不是线程安全的

Android基本功:异步任务(AsyncTask)

风格不统一 提交于 2019-12-20 10:21:03
一、解决新线程无法更新UI组建问题的方案 为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案: 使用Handler实现线程之间的通信。 Activity.runOnUiThread(Runnable)。 View.post(Runnable)。 View.postDelayed(Runnable)。 二、ANR(Application Not Responding)异常 Android默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但实际上,不要说20秒,即使是5秒甚至2秒,用户都会感到十分不爽。因此,没必要去记这个20秒的时间限度。总之,开发者必须牢记:不要在UI线程中执行一些耗时操作。 三、AsyncTask抽象类 AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数: Params:启动任务执行的输入参数的类型。 Progress:后台任务完成进度值的类型。 Result:后台执行任务完成后返回结果的类型。 四、AsyncTask的特点 更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。 五、使用AsyncTask的步骤 1.创建AsyncTask的子类,并为三个泛型参数指定类型

AsyncTask与IntentService

馋奶兔 提交于 2019-12-19 16:58:57
https://blog.csdn.net/qq_35572068/article/details/84961265 https://blog.csdn.net/lxg1234567890/article/details/27048949 Android主线程,也就是UI线程,其最大用途在于运行四大组件以及处理他们和用户的交互。其他耗时操作交给子线程,如网络请求、I/O操作,从Android3.0开始,网络访问必须在子线程中进行,否则将会失败并抛弃异常,避免ANR现象。 AsyncTask是轻量级异步任务类,封装了Thread和Handler。 AsyncTask : onPreExecute(),异步执行之前,此方法被调用做一些准备工作。doInBackground()在线程池中执行,此方法用于执行异步任务。doInBackground()在线程池中执行,此方法用于执行异步任务,执行过程中可以调用publishProgress()方法更新任务执行进度。onProgressUpdate()方法在主线程中执行,每次任务进度更新时被调用。onPostExecute()在任务执行完成时被调用,其参数为doInBackground()的返回参数。 执行顺序与联系如下图 代码Demo: public class DownloadFileAsyncTackDemo extends

面试过程中,你知道这些小知识,将事半功倍

╄→尐↘猪︶ㄣ 提交于 2019-12-11 21:01:17
在平时我们面试的过程总总会遇到一些面试官问一些平时我们不怎么注意的问题,当问出来的时候,面试者通常都是一脸懵逼,这和我想象中的不一样阿,怎么不按照套路出牌,当然一些小知识更能体现出你的细心和好学,以下分析20个面试中的小知识,共勉~.· 整理的这份PDF有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记 (更多完整项目下载。未完待续。源码。图文知识后续上传github。) 可以点击 关于我 联系我获取完整PDF和面试准备路线 ( VX:mm14525201314 ) Android 面试帮助篇 1 、要做一个尽可能流畅的 ListView ,你平时在工作中如何进行优化的? ①Item 布局,层级越少越好,使用 hierarchyview 工具查看优化 。 ②复用 convertView ③使用 ViewHolder ④item 中有图片时,异步加载 ⑤快速滑动时,不加载图片 ⑥item 中有图片时,应对图片进行适当压缩 ⑦实现数据的分页加载 2 、对于 Android的安全问题 ①错误导出组件 ② 参数校验不严 ③WebView 引入各种安全问题,webview 中的 js 注入 ④不混淆、不防二次打包

Android 多线程和线程池详解

£可爱£侵袭症+ 提交于 2019-12-06 07:47:51
AsyncTask 使用 AsyncTask 需要继承 AsyncTask,重写 doInBackground 方法。 onPreExecute 运行在调度线程 doInBackground 运行在线程池中 onPostExecute / onProgressUpdate / onCancelled 运行在 UI 线程中。 原理 AsyncTask 内部有两个静态线程池 一个线程池 SERIAL_EXECUTOR 表示串行线程池,内部包含一个消息队列,用来保存任务、按顺序调度任务 一个 THREAD_POOL_EXECUTOR 用来执行任务,其线程数量是根据 CPU 核数计算的 一个跑在主线程的 Handler,把执行进度和执行结果的回调发送到主线程 这两个线程池和一个 Handler 都是静态的,实际上是所有的 AsyncTask 对象公用的 特点和缺陷 4.1之前版本需要在主线程完成初始化,现在的版本不需要初始化了 5.0以及之前 AsyncTask 对象必须在主线程创建,execute 方法必须在主线程调用,之后的版本无此限制,但是 onPreExecute 方法会在调度线程执行 一个 AsyncTask 只能执行一次,否则会报错 1.6之前是串行任务,1.6开始采用线程池处理任务,3.0开始又串行任务,但可以使用 executeOnExecutor 并行 一般会把

Android 异步加载解决方案

陌路散爱 提交于 2019-12-05 13:11:40
Android 的 Lazy Load 主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍 Android 开发过程中,异步处理这个常见的技术问题之前,我们简单回顾下 Android 开发过程中需要注意的几个地方。 Android 应用开发过程中必须遵循单线程模型 (Single Thread Model) 的原则。因为 Android 的 UI 操作并不是线程安全的,所以涉及 UI 的操作必须在 UI 线程中完成。但是并非所有的操作都能在主线程中进行,Google工程师在设计上约定, Android 应用在 5s 内无响应的话会导致 ANR(Application Not Response) ,这就要求开发者必须遵循两条法则: 1 、不能阻塞 UI 线程, 2 、确保只在 UI 线程中访问 Android UI 工具包。于是,开启子线程进行异步处理的技术方案应运而生。 本文以自定义 ListView ,异步加载网络图片示例,总结了 Android 开发过程中,常用的三种异步加载的技术方案。 相关资源: AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.doodle

Android的UI设计与后台线程交互

ぐ巨炮叔叔 提交于 2019-12-05 13:11:27
本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行。本文还将阐述一些用户界面(UI)中与线程交互的API。 UI用户界面线程 当应用程序启动时,系统会为应用程序创建一个主线程(main)或者叫UI线程,它负责分发事件到不同的组件,包括绘画事件。完成你的应用程序与Android UI组件交互。 例如,当您触摸屏幕上的一个按钮时,UI线程会把触摸事件分发到组件上,更改状态并加入事件队列,UI线程会分发请求和通知到各个组件,完成相应的动作。 单线程模型的性能是非常差的,除非你的应用程序相当的简单,特别是当所有的操作都在主线程中执行,比如访问网络或数据库之类的耗时操作将会导致用户界面锁定,所有的事件将不能分发,应用程序就像死了一样,更严重的是当超过5秒时,系统就会弹出“应用程序无响应”的对话框。 如果你想看看什么效果,可以写一个简单的应用程序,在一个Button的OnClickListener中写上Thread.sleep(2000),运行程序你就会看到在应用程序回到正常状态前按钮会保持按下状态2秒,当这种情况发生时,您就会感觉到应用程序反映相当的慢。 总之,我们需要保证主线程(UI线程)不被锁住,如果有耗时的操作,我们需要把它放到一个单独的后台线程中执行。 下面是一个点击按钮后下载一个图片