android线程

第11章 Android的线程和线程池

故事扮演 提交于 2019-12-21 05:11:10
常见的线程形态 AsyncTask:不适合特别耗时的后台任务,耗时使用线程池。 必须在主线程中加载。 Android3.0以后是串行执行的,3.0以前是并行。 HanderThread:继承了Thread,是一种可以使用Handler的Thread,和普通的Thread的区别是在run方法中可通过Looper.prepare创建消息队列。 并通过Looper.loop()来开启消息循环。 IntentService:抽象类,适合执行高优先级 后台任务。 每执行一个后台任务就必须启动一次IntentService,内部则通过消息的方式向HanderThread请求执行任务,Handler中的Looper是顺序 处理消息的,所以IntentService也是顺序执行后台任务的,当有多个后台任务同时存在时,后台任务会按照外界发起的顺序排队执行。 线程池ThreadPoolExecutor 优点: 1、重用线程中的线程避免因为线程的创建和销毁所带来的性能开销; 2、能有效控制线程池最大并发数,避免大量的线程之间因互相抢占资源导致阻塞; 3、对线程进行管理,提供定时执行以及指定间隔循环执行等功能。 publicThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit

Android中线程和线程池

江枫思渺然 提交于 2019-12-21 05:10:55
我们知道线程是CPU调度的最小单位。在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的。在Android中,除了Thread外,扮演线程的角色有很多,如AsyncTask,IntentService和HandlerThread等等。由于内容过多,所以将分为上下两部分,第一部分主要和大家谈谈Android中的线程,以及在Android中的常用的线程池。第二部分我们一起来了解一下AsyncTask的使用和工作原理。 1、HandlerThread HandlerThread是Thread的子类,它是一种可以使用Handler的Thread,它的实现比较简单。我们来看看它的源码: 1 package android.os; 2 3 public class HandlerThread extends Thread { 4 int mPriority; 5 int mTid = -1; 6 Looper mLooper; 7 8 public HandlerThread(String name) { 9 super(name); 10 mPriority = Process.THREAD_PRIORITY_DEFAULT; 11 } 12 13 14 public HandlerThread(String name, int priority) { 15 super

Android 线程池

纵饮孤独 提交于 2019-12-21 05:10:07
先来看一下ThreadPoolExecutor的构造方法 //五个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) //六个参数的构造函数-1 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) //六个参数的构造函数-2 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) //七个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int

主线程与子线程之间相互通信

流过昼夜 提交于 2019-12-17 13:45:14
在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了。那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程发送消息,希望子线程来完成什么任务。如果这样子应该怎么做呢?这就是这篇文章将要讨论的内容。 一、HandlerThread类 主线程发送消息给子线程,通常思维逻辑就是:其实很简单,在主线程中实例化一个Handler,然后让他与子线程相关联(只要它与子线程的Looper相关联即可),这样子它处理的消息就是该子线程中的消息队列,而处理的逻辑都是在该子线程中执行的,不会占用主线程的时间。那么我们就来实现一下,看看这样子到底行得通还是行不通。新建项目,修改它的MainActivity的代码,如下即可: 1 package com.example.handldertest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Looper; 7 import android.util.Log; 8 import android.widget.TextView; 9 10 public class ThreadHandlerActivity extends

android.os.NetworkOnMainThreadException异常处理

独自空忆成欢 提交于 2019-12-15 17:45:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 第一种: public void onCreate(Bundle savedInstanceState) { // 详见StrictMode文档 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); super.onCreate(savedInstanceState); setContentView(R.layout.main); InitDialog(); } 在android 2.3上设计的下载程序,在android 4.0上运行时报 android.os

Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

痴心易碎 提交于 2019-12-15 17:44:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 概述 :每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程。而由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作。如果在非UI线程直接对UI进行了操作,则会报错: CalledFromWrongThreadException:only the original thread that created a view hierarchy can touch its views 。 Android为我们提供了消息循环的机制,我们可以利用这个机制来实现线程间的通信。那么,我们就可以在非UI线程发送消息到UI线程,最终让Ui线程来进行ui的操作。 对于运算量较大的操作和IO操作,我们需要新开线程来处理这些繁重的工作,以免阻塞ui线程。 例子: 下面我们以获取CSDN logo的例子,演示如何使用Thread+Handler的方式实现在非UI线程发送消息通知UI线程更新界面。 ThradHandlerActivity.java: public class ThreadHandlerActivity extends Activity { /** Called when the

android开发之线程(守护线程daemon和User Thread)

北战南征 提交于 2019-12-14 18:39:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java将线程分为User线程和Daemon线程两种。其中 Daemon thread即守护线程。 1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程 2.Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出。 通常Daemon线程用来为User线程提供某些服务。程序的main()方法线程是一个User进程,User进程创建的进程为User进程。当所有的User线程结束后,JVM才会结束。 3. 通过在一个线程对象上调用setDaemon(true),可以将user线程创建的线程明确地设置成Daemon线程。例如,时钟处理线程、idle线程、垃圾回收线程、屏幕更新线程等,都是Daemon线程。通常新创建的线程会从创建它的进程哪里继承daemon状态,除非明确地在线程对象上调用setDaemon方法来改变daemon状态。 需要注意的是,setDaemon()方法必须在调用线程的start()方法之前调用。一旦一个线程开始执行(如,调用了start()方法),它的daemon状态不能再修改。通过方法isDaemon()可以知道一个线程是否Daemon线程。 4.总之

关于JVM和Dalvik的区别

扶醉桌前 提交于 2019-12-14 16:54:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Dalvik和JVM的几点区别 1、Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 2、Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。 3、Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。 4、不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex,ex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。 5、所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制 以上引用自: http://blog.csdn.net/songcdut/article/details/6952617 来源: oschina 链接: https://my.oschina.net/u/919173/blog/161779

Android性能优化--启动优化

自闭症网瘾萝莉.ら 提交于 2019-12-10 18:01:50
1. 前言 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。本文会通过以下几个方面来介绍应用启动的相关指标和优化,提供应用的启动速度。 整体文章思路如下: 2. 冷启动&热启动 通常来说,启动方式分为两种:冷启动和热启动。 **冷启动:**当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。 **热启动:**当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。 两者之间的特点如下: 冷启动:系统会重新创建一个新的进程分配给该应用,从Application创建到UI绘制等相关流程都会执行一次。 热启动:应用还在后台,因此该启动方式不会重建Application,只会重新绘制UI等相关流程。 冷热启动时间的计算命令: adb shell am start -W [packageName]/[packageName.XxxActivity] 参数说明: 1、ThisTime:一般和TotalTime时间一样

Java 四种线程池的用法分析

孤者浪人 提交于 2019-12-10 07:43:49
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 线程池 Java通过 Executor s提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool