android线程

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

线程、多线程和线程池面试专题

社会主义新天地 提交于 2019-11-28 23:59:50
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: 1、开启线程的三种方式? 1)继承 Thread 类,重写 run() 方法,在 run() 方法体中编写要完成的任务 new Thread().start(); 2)实现 Runnable 接口,实现 run() 方法 new Thread(new MyRunnable()).start(); 3)实现 Callable 接口 MyCallable 类,实现 call() 方法,使用 FutureTask 类来包装 Callable 对象,使用 FutureTask 对象作为 Thread 对象的 target 创建并启动线程;调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。 FutureTask<Integer> ft = new FutureTask<Integer>(new MyCallable()); new Thread(ft).start(); 2、run()和start()方法区别 run() 方法只是线程的主体方法,和普通方法一样,不会创建新的线程。 只有调用 start() 方法,才会启动一个新的线程,新线程才会调用

第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

关键方法

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-28 08:41:35
3.1 run()方法 处理线程中执行的逻辑,如果继承Thread类则必须重写该方法. 3.2 start()方法 //方法是加了锁的。 //原因是避免开发者在其它线程调用同一个Thread实例的这个方法,从而尽量避免抛出异常。 //这个方法之所以能够执行我们传入的Runnable里的run()方法, //是应为JVM调用了Thread实例的run()方法。 public synchronized void start() { //检查线程状态是否为0,为0表示是一个新状态,即还没被start()过。不为0就抛出异常。 //就是说,我们一个Thread实例,我们只能调用一次start()方法。 if (threadStatus != 0 || started) throw new IllegalThreadStateException(); 从这里开始才真正的线程加入到ThreadGroup组里。 //再重复一次,前面只是把nUnstartedThreads这个计数器进行了增量,并没有添加线程。 //同时,当线程启动了之后,nUnstartedThreads计数器会-1。因为就绪状态的线程少了一条啊! group.add(this); started = false; try { //Native方法。这里交由JVM处理,会调用Thread实例的run()方法。

Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

Deadly 提交于 2019-11-28 01:41:28
Java 四种线程池 newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newSingleThreadExecutor 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread ( new Runnable ( ) { @Override public void run ( ) { // TODO Auto-generated method stub } } ) . start ( ) ; 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期执行、线程中断。 相比new Thread,Java提供的四种线程池的好处在于: a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 c. 提供定时执行、定期执行、单线程、并发数控制等功能。 2、Java 线程池

Android进阶-Android性能优化总结

孤街醉人 提交于 2019-11-28 00:21:40
一、Android性能优化的方面 针对Android的性能优化,主要有以下几个有效的优化方法: 1.布局优化 2.绘制优化 3.内存泄漏优化 4.响应速度优化 5.ListView/RecycleView及Bitmap优化 6.线程优化 7.其他性能优化的建议 下面我们具体来介绍关于以上这几个方面优化的具体思路及解决方案。 二、布局优化 关于布局优化的思想很简单,就是尽量减少布局文件的层级。这个道理很浅显,布局中的层级少了,就意味着Android绘制时的工作量少了,那么程序的性能自然就提高了。 如何进行布局优化? ①删除布局中无用的控件和层次,其次有选择地使用性能比较低的ViewGroup。 关于有选择地使用性能比较低的ViewGroup,这就需要我们开发就实际灵活选择了。 例如:如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就采用LinearLayout,这是因为RelativeLayout的功能比较复杂,它的布局过程需要花费更多的CPU时间。FrameLayout和LinearLayout一样都是一种简单高效的ViewGroup,因此可以考虑使用它们,但是 很多时候单纯通过一个LinearLayout或者FrameLayout无法实现产品效果,需要通过嵌套的方式来完成。这种情况下还是建议采用RelativeLayout

深入解读Linux与Android的相互关系& Android消息处理系统的原理

 ̄綄美尐妖づ 提交于 2019-11-27 15:33:53
深入解读Linux与Android的相互关系 大家都知道Android是基于Linux内核的 操作系统 ,也曾经和Linux基金会因为内核问题产生过分歧,本文将开始对Android的内核进行剖析,主要介绍Android和Linux之间的关系,后续还会讲到Android系统在Linux系统之上扩展的部分功能和驱动,希望大家能够持续关注IT168技术频道。 虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了自己所特有的驱动程序。下面我们就来分析一下它们之间究竟有什么关系? 一、 Android为什么会选择Linux 成熟的 操作系统 有很多,但是Android为什么选择采用Linux内核呢?这就与Linux的一些特性有关了,比如: 1、强大的 内存 管理和进程管理方案 2、基于权限的安全模式 3、支持共享库 4、经过认证的驱动模型 5、Linux本身就是开源项目 更多关于上述特性的信息可以参考Linux 2.6版内核的官方文档,这便于我们在后面的学习中更好地理解Android所特有的功能特性。接下来分析Android与Linux的关系。 二、Android不是Linux 看到这个标题大家可能会有些迷惑,前面不是一直说Android是基于Linux内核的吗,怎么现在又不是Linux了?迷惑也是正常的

Android 面试知识集1

会有一股神秘感。 提交于 2019-11-27 13:53:13
  今晚在复习Android基础的时候,找到了一些很有价值的基础知识,分享给给位Android的开发者。这些是基础知识,同时也可以当做面试准备。面试题其实是很好的基础知识学习,有空会好好整理相关基础知识。 1.Activity的生命周期 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的时候调用。这里是你做所有初始化设置的地方──创建视图、设置布局、绑定数据至列表等。如果曾经有状态记录(参阅后述 Saving Activity State 。),则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数。 总继之以onStart()。 否 onStart() onRestart() 在activity停止后onStop(),在再次启动之前被调用。 总继之以onStart()。 否 onStart() onStart() 当activity正要变得为用户所见时被调用。 当activity转向前台时继以onResume(),在activity变为隐藏时继以onStop()。 否 onResume() or onStop() onResume() 在activity开始与用户进行交互之前被调用。此时activity位于堆栈顶部,并接受用户输入。 继之以onPause()。 否 onPause() onPause()

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)的引用,造成内存泄露,资源造成得不到释放。 保存了多个耗用内存过大的对象

Android 多线程之几个基本问题

我只是一个虾纸丫 提交于 2019-11-26 18:08:54
Android中的进程和线程 Android中的一个应用程序一般就对应着一个进程,多进程的情况可以参考 Android 多进程通信之几个基本问题 Android中更常见的是多线程的情况,一个应用程序中一般都有包括UI线程等多个线程。Android中规定网络访问必须在子线程中进行,而操作更新UI则只能在UI线程。 常见的网络请求库,如OkHttp、Volly等都为我们封装好了线程池,所以我们在进行网络请求时一般不是很能直观地感受到创建线程以及切换线程的过程。 线程是一种很宝贵的资源,要避免频繁创建销毁线程,一般推荐用线程池来管理线程。 线程的状态 线程可能存在6种不同的状态:新创建(New)、可运行(Runnable)、阻塞状态(Blocked)、等待状态(Waiting)、限期等待(Timed Waiting)、终止状态(Terminated) 新创建(New):创建后但还未启动的线程(还没有调用start方法)处于这种状态 可运行(Runnable):一旦调用了start方法,线程就处于这种状态。需要注意的是此时线程可能正在执行,也可能在等待CPU分配执行的时间 阻塞状态(Blocked):表示线程被锁阻塞,等待获取到一个排他锁。在程序等待进入同步区域时,线程将进入这种状态 等待状态(Waiting):处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显示地唤醒