父类的普通方法可以被继承和重写,不多作解释,如果子类继承父类,而且子类没有重写父类的方法,但是子类会有从父类继承过来的方法。
静态的方法可以被继承,但是不能重写。如果父类中有1个静态的方法,子类也有1个与其方法名,参数类型,参数个数都1样的方法,并且也有static关键字修饰,那末该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪个方法是看是哪一个对象的援用;这类父子类方法也不在存在多态的性质。《Java编程思想》中这样提到“只有普通的方法调用可以是多态的”。
>
作甚静态?静态方法是类在加载时就被加载到内存中的方法,在全部运行进程中保持不变,因此不能重写。但非静态方法是在对象实例化时才单独申请内存空间,为每个实例分配独立的运行内存,因此可以重写。
1、Vector是多线程安全的,而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就致使了Vector在效力上没法与ArrayList相比;
2、两个都是采取的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的,很多网友说Vector增加原来空间的1倍,ArrayList增加原来空间的50%,其实也差不多是这个意思,不过还有1点点问题可以从源码中看出,1会儿从源码中分析。
3、Vector可以设置增长因子,而ArrayList不可以,最开始看这个的时候,我没理解甚么是增量因子,不过通过对照1下两个源码理解了这个,先看看两个类的构造方法:
桌面小部件则是通过AppWidgetProvider来实现的,AppWidget本质是1个广播.
通知栏和桌面小部件的开发进程中都会用到RemoteView,它们在更新界面时没法像在Activity里面那样直接更新View,这是由于二者的界面都运行在其他线程中,确切的说是系统的SystemServer进程.为了跨进程更新界面,RemoteViews提供1系列set方法,并且这些方法只是View全部方法的子集,另外RemoteVIew支持的View类型也是有限的。
surfaceView是在1个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。那末在UI的主线程中更新画面 可能会引提问题,比如你更新画面的时间太长,那末你的主UI线程会被你正在画的函数阻塞。那末将没法响应按键,触屏等消息。当使用surfaceView 由因而在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外1个问题,就是事件同步。比如你触屏了1下,你需要surfaceView中 thread处理,1般就需要有1个event queue的设计来保存touch event,这会稍稍复杂1点,由于触及到线程同步。
在Android中进程按优先级可以分为5类,优先级从高到低排列:
- 前台进程 该进程包括正在与用户进行交互的界面组件,比如1个Activity
- 可视进程 该进程中的组件虽然没有和用户交互,但是依然可以被看到
- 服务进程 该进程包括在履行后台操作的服务组件,比如播放音乐的进程
- 后台进程 该进程包括的组件没有与用户交互,用户也看不到
- 空进程 没有任何界面组件、服务组件,或触发器组件**
Android系统是进程托管的,也就是说进程都是由系统来管理,系统会依照特定的算来来回收这些进程。在回收中秉持几个原则
1. 尽可能延上进程的生命周期,不到必须的情况下不会回收,由于系统回收进程会影响用户体验
2. 按优先级从低到高进行回收
3. 同等优先级的进程越近使用越晚回收。
进程过1段时间后是会被回收的,但要遵守上面的这些原则,播放音乐的这个进程的优先级还是比较高的,所以被稀里糊涂地回收的可能性不大,在播放音乐时无缘无故地停止这样的情况很少对吧?service和application的生命周期有关,只要进程被回收,那末它所占用的所有资源将被回收。
仔细分析在1个静态成员的变量中保存了Activity里面的1个视图,可恶的是视图中保存了Context的援用,这个时候就产生了1个对象长时间被援用,致使Activity没法被GC掉,Activity占用的内存也没法被GC掉。这个时候内存溢动身生了。
浅谈Android开发中内存泄漏与优化
http://m.blog.csdn.net/article/details?id=50581404
http://www.linuxidc.com/Linux/2015⑴2/126432.htm
eclipse的jni的开发,
dnk环境搭建
先要用编译,在bin里,用javah编译,生成.h文件。
编写Android.mk文件
用gunstep生成so文件。
用Android studio 来开发jni
并发:
多个用户争取同1个资源(这个资源可以是服务器上的日志,可以是履行某1此sql操作,可使ftp服务器上的某个文件等,又或是程序中的某1个全局变量,因此我们可以称这类资源为:全局资源);
解释:
并发是在多个用户要求同1个资源的时候,或是程序本身多线程要求同1个资源的时候酿成的。
比如:
1个财务系统,两个人同时对总钱数进行操作,1个加10块1个减100块,注意这两个操作是同时进行的,那系统就不知道是加还是减了,这是并提问题。或,多个线程同时要求同1个资源,必定致使此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理(线程安全)。
异步:
A线程要要求某个资源,但是此资源正在被B线程使用中,由于没有同步机制存在,A线程
依然要求的到这个资源,A线程无需等待。
同步:
A线程要要求某个资源,但是此资源正在被B线程使用中,由于同步机制存在,A线程要求
不到,怎样办,A线程只能等待下去。
同步与异步:
明显,同步最安全,最保险的。而异步不安全,容易致使死锁,这样1个线程死掉就会致使全部
进程崩溃,但没有同步机制的存在,性能会有所提升。所以对同步与异步必须有所取舍。
Java同步机制有4种实现方式:(部份援用网上资源)
① ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile
目的:都是为了解决多线程中的对同1变量的访问冲突
ThreadLocal
ThreadLocal 保证不同线程具有不同实例,相同线程1定具有相同的实例,即为每个使用该
变量的线程提供1个该变量值的副本,每个线程都可以独立改变自己的副本,而不是与其它线程的副本冲突。
优势:提供了线程安全的同享对象
与其它同步机制的区分:同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通讯;而 ThreadLocal 是隔离多个线程的数据同享,从根本上就不在多个线程之间同享资源,这样固然不需要多个线程进行同步了。
volatile
volatile 修饰的成员变量在每次被线程访问时,都逼迫从同享内存中重读该成员变量的值。
而且,当做员变量产生变化时,逼迫线程将变化值回写到同享内存。
优势:这样在任什么时候刻,两个不同的线程总是看到某个成员变量的同1个值。
缘由:Java 语言规范中指出,为了取得最好速度,允许线程保存同享成员变量的私有拷贝,而
且只当线程进入或离开同步代码块时才与同享成员变量的原始值对照。这样当多个线程同时与某
个对象交互时,就必须要注意到要让线程及时的得到同享成员变量的变化。而 volatile 关键字就
是提示 VM :对这个成员变量不能保存它的私有拷贝,而应直接与同享成员变量交互。
使用技能:在两个或更多的线程访问的成员变量上使用 volatile 。当要访问的变量已在
synchronized 代码块中,或为常量时,没必要使用。
线程为了提高效力,将某成员变量(如A)拷贝了1份(如B),线程中对A的访问其实访问的
是B。只在某些动作时才进行A和B的同步,因此存在A和B不1致的情况。volatile就是用来避免这类
情况的。 volatile告知jvm,它所修饰的变量不保存拷贝,直接访问主内存中的(读操作多时使用
较好;线程间需要通讯,本条做不到)
Volatile 变量具有 synchronized 的可见性特性,但是不具有原子特性。这就是说线程能够自
动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能利用于非常有限的
1组用例:多个变量之间或某个变量确当前值与修改后值之间没有束缚。
您只能在有限的1些情形下使用 volatile 变量替换锁。要使 volatile 变量提供理
想的线程安全,必须同时满足下面两个条件:
对变量的写操作不依赖于当前值;该变量没有包括在具有其他变量的不变式中。
sleep() vs wait()
sleep是线程类(Thread)的方法,致使此线程暂停履行指定时间,把履行机会给其他线程,但是监
控状态仍然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法致使本线程放弃对象锁,进入等待此对象的等待锁
定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备取得对象锁
进入运行状态。
(如果变量被声明为volatile,在每次访问时都会和主存1致;如果变量在同步方法或同步块中
被访问,当在方法或块的入口处取得锁和方法或块退出时释放锁时变量被同步。)
9.1自定义view
9.2图表,柱状图
9.3新特性view
Android开发之RecyclerView的使用全解
HTTP协议状态码表示的意思主要分为5类 ,大体是 :
1×× 保存
2×× 表示要求成功地接收
3×× 为完成要求客户需进1步细化要求
4×× 客户毛病
5×× 服务器毛病
AsyncTask的本质是1个线程池,所有提交的异步任务都会在这个线程池中的工作线程内履行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler(原理见:《Handler+Looper+MessageQueue深入详解》)传递消息的方式,调用相干的回调函数,从而实现UI界面的更新。
1、 AsyncTask的本质是1个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中履行。
2、线程池中的工作线程履行doInBackground(mParams)方法履行异步任务
3、当任务状态改变以后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相干的回调函数
handler不是不可以在子线程里生成,生成时,需要prepare,否则报错。
具体见博客。
1般大家都知道ArrayList和LinkedList的大致区分:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对随机访问get和set,ArrayList觉得优于LinkedList,由于LinkedList要移动指针。
3.对新增和删除操作add和remove,LinedList比较占优势,由于ArrayList要移动数据。
当Android系统启动1个利用的时候,有1步是对Dex进行优化,这个进程有1个专门的工具来处理,叫DexOpt。DexOpt的履行进程是在第1次加载Dex文件的时候履行的。这个进程会生成1个ODEX文件,即Optimised Dex。履行ODex的效力会比直接履行Dex文件的效力要高很多。但是在初期的Android系统中,DexOpt有1个问题,也就是这篇文章想要说明并解决的问题。DexOpt会把每个类的方法id检索起来,存在1个链表结构里面。但是这个链表的长度是用1个short类型来保存的,致使了方法id的数目不能够超过65536个。当1个项目足够大的时候,明显这个方法数的上限是不够的。虽然在新版本的Android系统中,DexOpt修复了这个问题,但是我们依然需要对老系统做兼容。
android studio 中这样做
android{
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "4g" //set the max heap size for dexing to 4GB.
incremental true
}
}
dependencies {
//compile fileTree(include: ['*.jar'], dir: 'libs')
//compile project(':library')
compile 'com.android.support:multidex:1.0.1'
...
}
利用了甚么框架
框架是何种原理
github项目地址
HttpClient和HttpURLConnection的区分
github地址
android 介绍Retrofit的简单使用
Retrofit原理及调用流程分析
github地址
Android-xUtils框架原理分析
比较好的,就是下面这俩个,
腾讯im 免费,企业和个人
网易云信 个人有期限,企业收费
bugly
bghd
vitamio
ijkplayer
vlc
https://github.com/JakeWharton/butterknife
MVC之外的另两种软件架构(ORM,IOC)
mvp
使用新版Android Studio检测内存泄漏和性能
移动项目:开发,项目经理
个人仓库
无线电管理监测
智能玩具交互
党建加油站 视频播放器
混合开发:rn,cordova
后台:
spring hibernate
node