asynctask

从源码的角度认识AsyncTask

耗尽温柔 提交于 2019-11-29 14:37:37
一、为什么需要工作者线程 我们知道,Android应用的主线程(UI 线程)肩负着绘制用户界面和及时响应用户操作的重任,为了避免“用户点击按钮后没反应”这样的糟糕用户体验,我们就要确保主线程时刻保持着较高的响应性。为了做到这一点,我们就要把耗时的任务移出主线程,那么耗时的任务交给谁来完成呢?答案就是工作者线程。Android开发中我们通常让主线程负责前台用户界面的绘制以及响应用户的操作,让工作者线程在后台执行一些比较耗时的任务。Android中的工作者线程主要有AsyncTask、IntentService、HandlerThread,它们本质上都是对线程或线程池的封装。对线程和线程池还不太熟悉的小伙伴请参考文末“延伸阅读”部分给出的链接。 总的来说,我们使用工作者线程是因为主线程已经有很多活要干了,累活就得交给别人干。AsyncTask是我们日常中广泛使用的一种工作者线程,它的方便之处在于可以在后台任务执行完毕时根据返回结果相应的更新UI。下面我们来研究一下它的工作原理。 二、探索AsyncTask的工作原理 1. AsyncTask的使用简介 AsyncTask是对Handler与线程池的封装。使用它的方便之处在于能够更新用户界面,当然这里更新用户界面的操作还是在主线程中完成的,但是由于AsyncTask内部包含一个Handler,所以可以发送消息给主线程让它更新UI。另外

AsyncTask简单入门

爱⌒轻易说出口 提交于 2019-11-29 10:49:05
关系: java.lang.Object ↳ android.os.AsyncTask<Params, Progress, Result> 概述: AsyncTask是Android提供的轻量级异步类;它在后台线程处理耗时的操作然后可以将处理的结果返回给UI线程处理。由于它不涉及到使用Thread和Handler所以简单易用。 用法: 首先上一段Android Developer的代码: private class DownloadFilesTask extends AsyncTask < URL, Integer, Long > { 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 totalSize; } protected

作业五之AsyncTask,SQLite,Contacts,AutoCompleteTextView(Android)

僤鯓⒐⒋嵵緔 提交于 2019-11-29 10:45:09
这次的作业主要是考察SQLite的使用,获取手机联系人的信息(姓名,手机号码,QQ/备注),然后导入到数据库中,这里我采用了AsyncTask(异步任务)来处理大量数据的插入,这是Android推荐的多线程用法,当然也可以用Thread和Handler.作业还要求使用自动完成文本编辑框来完成数据搜索任务,所以也加入到标题关键词中去了.(图中那几个test是上一次作业从xls文件文件导入到联系人中的,有兴趣可以去看看) 哦,对,还有一个小地方就是关闭输入法面板,这也是我第一次用到,详情看源码吧: ) 感觉比较重要的代码就是AsyncTask这一块吧,以前都是用Thread和Handler的模型来做的,所以只贴这一部分的代码了,源码依然在最后: ) import java.util.Iterator; import com.fsproject.contactsdatabase.DatabaseControl.ContactsData; import android.content.ContentValues; import android.database.Cursor; import android.os.AsyncTask; import android.provider.ContactsContract; import android.view.Gravity; import

第11章 Android的线程和线程池

落花浮王杯 提交于 2019-11-28 19:45:37
除了Thread以外,在Android中可以扮演线程的角色还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程。 AsyncTask封装了线程池和Handler。HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。IntentService是一个服务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。IntentService是一种服务,不容易被系统杀死从而可以尽量保证任务的执行,如果是一个后台线程,由于这个时候进程中没有活动的四大组件,那么这个进程的优先级就会降低,容易被系统杀死,这就是IntentService的优点。 11.1 主线程和子线程 从Android3.0开始系统要求网络访问必须在子线程执行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常。 11.2 Android中的线程形态 11.2.1 AsyncTask AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 4个核心方法: onPreExecute() doInBackground(Params… params

[转] 有关Android线程的学习

断了今生、忘了曾经 提交于 2019-11-28 02:38:55
1. Android进程 在了解Android线程之前得先了解一下Android的进程。 当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。 同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用, 也能保证用户正在访问的当前进程有足够的资源去及时地响应用户的事件。Android会根据进程中运行的组件类别以及组件的状态来判断该进程的重要性,Android会首先停止那些不重要的进程。按照重要性从高到低一共有五个级别: 前台进程 前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何时候都存在。他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候。一般来说, 在这种情况下,设备会进行内存调度,中止一些前台进程来保持对用户交互的响应。 可见进程 可见进程不包含前台的组件但是会在屏幕上显示一个可见的进程是的重要程度很高,除非前台进程需要获取它的资源,不然不会被中止。 服务进程 运行着一个通过startService() 方法启动的service,这个service不属于上面提到的2种更高重要性的。service所在的进程虽然对用户不是直接可见的

Android中UI线程与后台线程交互设计的5种方法

早过忘川 提交于 2019-11-27 23:03:00
我想关于这个话题已经有很多前辈讨论过了。今天算是一次学习总结吧。 在android的设计思想中,为了确保用户顺滑的操作体验。一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新开启一个后台线程运行这些任务。然而,往往这些任务最终又会直接或者 间接的需要访问和控制UI控件。例如访问网络获取数据,然后需要将这些数据处理显示出来。就出现了上面所说的情况。原本这是在正常不过的现象了,但是 android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控。为了解决这个问题,于是就引出了我们今天的话题。Android中后台线 程如何与UI线程交互。 据我所知android提供了以下几种方法,用于实现后台线程与UI线程的交互。 1、handler 2、Activity.runOnUIThread(Runnable) 3、View.Post(Runnable) 4、View.PostDelayed(Runnabe,long) 5、AsyncTask 方法一:handler handler是android中专门用来在线程之间传递信息类的工具。 要讲明handler的用法非常简单,但是我在这里会少许深入的讲一下handler的运行机制。 为了能够让handler在线程间传递消息,我们还需要用到几个类。他们是looper,messageQueue,message

Android,谁动了我的内存(1)

不打扰是莪最后的温柔 提交于 2019-11-26 21:12:38
一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java的就比较人性化了,给我们请了一个专门的清洁工(GC)。 那么GC怎么能够确认某一个对象是不是已经被废弃了呢?Java采用了有向图的原理。Java将引用关系考虑为图的有向边,有向边从引用者指向引用对象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,根顶点可以到达的对象都是有效对象,GC不会回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。 二、Android的内存溢出 Android的内存溢出是如何发生的? Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。 为什么会出现内存不够用的情况呢?我想原因主要有两个: 由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。 保存了多个耗用内存过大的对象