android线程

Java(Android)线程池

一笑奈何 提交于 2019-12-02 18:06:34
介绍 new Thread的弊端及 Java 四种线程池的使用 ,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java 1 2 3 4 5 6 7 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 线程池 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要

设计模式:单例模式

蓝咒 提交于 2019-12-02 15:39:17
原文:https://www.cnblogs.com/android-blogs/p/5530239.html 优点: 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中。 保持程序运行的时候该中始终只有一个实例存在内存中 public class Singleton { private static volatile Singleton instance = null; private Singleton(){ } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } 要保证单例,需要做一下几步 必须防止外部可以调用构造函数进行实例化,因此构造函数必须私有化。 必须定义一个静态函数获得该单例 单例使用volatile修饰 使用synchronized 进行同步处理,并且双重判断是否为null,我们看到synchronized (Singleton.class)里面又进行了是否为null的判断,这是因为一个线程进入了该代码,如果另一个线程在等待

Android的内存泄漏和调试

孤者浪人 提交于 2019-12-02 08:54:36
Android的内存泄漏和调试 一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的. 那么GC怎么能够确认某一个对象是不是已经被废弃了呢?Java采用了有向图的原理。Java将引用关系考虑为图的有向边,有向边从引用者指向引用对象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,根顶点可以到达的对象都是有效对象,GC不会回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。 二、Android的内存溢出 Android的内存溢出是如何发生的? Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。 为什么会出现内存不够用的情况呢?我想原因主要有两个: 由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。 保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制。 三、常见的内存泄漏 1.万恶的static

C#-WinForm跨线程修改UI界面

末鹿安然 提交于 2019-12-01 18:34:53
待解决的问题 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。 因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。 例如在Android 4.0之后,UI线程内不允许执行网络请求,网络请求需要配合着如AsyncTask之类的工具类来完成。 而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误: “System.InvalidOperationException”类型的异常在 System.Windows.Forms.dll 中发生,但未在用户代码中进行处理 其他信息: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。 .Net提供了很多跨线程修改UI的方法,每种方法也有与之对应的工具类。我最常用的方法是Task + MethodInvoker的方式完成跨线程对UI对的修改(个人觉得这种方法写起来比较简洁)。 实例代码 界面设计 界面上只有一个按钮和一个进度条: 源代码 public partial class Form1 : Form { public

腾讯、网易云、字节跳动面试点总结—AMS在Android起到什么作用?

谁说我不能喝 提交于 2019-12-01 05:40:02
本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: AMS在Android起到什么作用,简单的分析下Android的源码 心理分析:这道题在发生在大多数场景下。面对这道题 很多求职很茫然,不知道该如何说起。AMS本身比较复杂难以理解。工作多年也很难弄清AMS的作用,其实我们大可从以下几点入手组件启动、进程切换、Crash异常入手 求职者:AMS难以表述 我们就从最熟知 的Activity启动入手,逐步深入和分析,用定力告诉面试官,我层深入研究过。接下来我们从五条线分析AMS作用及机制 概述 相信大多数动脑同学对文章中提到的ActivityManagerService(以后简称AMS)都有所耳闻。 AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。 AMS是碰到的第一块难啃的骨头[①],涉及的知识点较多。为了帮助读者更好地理解AMS,接下来将带小伙伴么按五条不同的线来分析它。 第一条线:同其他服务一样,将分析SystemServer中AMS的调用轨迹。 第二条线:以am命令启动一个Activity为例,分析应用进程的创建、Activity的启动,以及它们和AMS之间的交互等知识。 第三条线和第四条线

kotlin 协程 与 android ImageView

荒凉一梦 提交于 2019-12-01 02:58:22
今天因为要给banner的图片添加圆角,使用 Bitmap 转换圆角 用协程去切换线程 在Debug中出现 ThreadException: Only the original thread that Created a view hierarchy can touch its views 不debug时正常显示 猜测原因为: 协程在debug时,当前线程被断点阻塞,自动切换到其他线程中去了 导致不是原始的view历史记录线程操作显示View 解决办法为: 在与UI界面的控件交互的代码 加上 withContext(Dispatchers.Main){  //你的 view 代码   imageView.setImageBitmap(bitmap) } 来源: https://www.cnblogs.com/caosq/p/11649746.html

Android中UI线程与worker线程的通信方法

那年仲夏 提交于 2019-11-30 22:38:26
在安卓开发中,线程是十分重要的,几乎你能看到的所有的界面或者功能都是通过线程来完成的。安卓中的线程又分UI线程和工作线程。其中UI线程主要负责和用户交互(说白了就你你在安坐上看到的界面,点击或者拖动这样一些效果);而其它线程出现的主要目的是为UI线程服务。 一般而言,用户新建线程的目的是为了做一些计算或者进行一些IO操作来处理用户的需求。但是由于UI线程和其它线程是两个线程,不能使用一般的在同一个线程间变量通信的方式来进行数据传递。只好令找解决办法,目前我发现了又如下方法可以解决这个问题: 方法一:使用final关键字:在新线程中使用UI线程中定义的变量 将想要被新线程使用的变量用final关键字修饰后传入新线程中,就能在新线程中使用该变量的值,则此时的数据传递方式是:UI线程 --》 新线程。具体的代码实现如下: final String flag = "hello android thread"; new Thread(new Runnable() { @Override public void run() { System.out.println(res); } }).start(); 方法二:使用handler进行线程之间的通信 实现原理:新线程向主线程发消息,主线程处理消息(有点类似与windows的消息处理机制)。具体的实现方式如下: final Handler

Android Thread Runnable

不问归期 提交于 2019-11-30 02:08:11
Runnable就是一个接口 public interface Runnable { /** * Starts executing the active part of the class' code. This method is * called when a thread is started that has been created with a class which * implements {@code Runnable}. */ void run(); } Thread是线程,继承了Runnable接口,同时init方法可以传入Runnable,作为Target public Thread(Runnable target, String name) { init(null, target, name, 0); } private void init(ThreadGroup g, Runnable target, String name, long stackSize) { Thread parent = currentThread(); if (g == null) { g = parent.getThreadGroup(); } g.addUnstarted(); this.group = g; this.target = target; this

线程与进程的区别

冷暖自知 提交于 2019-11-29 21:57:32
进程与线程的区别是很重要的一个知识点,也是面试中经常问到的。网上转载博客痕迹明显,且千篇一律。我简单提取下,记录下来,希望能帮到你。 另外在 LeetCode 上也有关于此问题的讨论,可以直接浏览“Read more” 部分。 引入进程之前–多道程序设计 概述 多道程序设计技术 是操作系统最早引入的技术,它的设计思想是允多个程序 同时 进入内存并运行,其目的是为了CPU的利用率,进而提高系统效率。 特点 多道程序设计技术引入之前,多个程序串行执行。只存在一个程序计数器(PC, program counter),一个程序执行完毕之后,才会执行下一个程序。而多道程序设计技术允许多个程序同时进入内存并运行,那就要每个程序分配程序计数器。如果内存中有四个程序在并发执行,那就需要四个程序计数器。 新技术带来的问题 一个技术、一个机制的引入,一方面解决了以前棘手的问题,但同时,往往带来新的问题。多道程序设计技术也是如此。 多道程序设计技术允许多个程序同时进入内存并运行,在这样的并发环境下,如何描述、刻画这样执行的程序呢?因此引入了“进程”。 进程(Process) 定义 进程是具有独立功能的程序关于 某个数据集合上 的 一次运行活动 ,是系统进行资源分配和调度(若不支持线程机制,进程的系统调度的单位。否则,线程是系统调度的单位)的独立单位。  特点 进程是程序的一次执行过程

从源码的角度认识AsyncTask

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