周学习记录10.8

setContentView();

  1. setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来。
    2、setContentView必须要放在findviewbyid之前,因为view在加载之前是无法引用的。
    3、setContentView最本质的作用是为要显示的view分配内存。

android:cacheColorHint属性的作用是什么?

背景色,常用在优化自定义Listview中android:cacheColorHint="#000000" 去除listview的拖动背景色

 前提:建立的安卓project必须是API 19以上的才行,也就是Android4.4版本号以上。

步骤1:

在布局文件的最外层Layout上加上两个属性。

android:clipToPadding="true"
android:fitsSystemWindows="true"

步骤2:

在Activity的onCreate()方法中增加两行代码:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); //透明导航栏

步骤3:

在Activity的onCreate()方法中增加一行代码:

requestWindowFeature(Window.FEATURE_NO_TITLE);//设置无标题栏

注意:此句代码一定要加在 setContentView(R.layout.activity_main);之前。

通过以上三步简单的操作,这样就能够实现状态栏变色啦!

listView.setCacheColorHint(0); 或者android:cacheColorHint="#000000" 去除listview的拖动背景色

Java中不叫指针而是叫做对象变量,只有引用一说。

android中有三种智能指针,分别是轻量级指针,强指针,弱指针。

强指针:它主要是通过强引用计数来进行维护对象的生命周期。

弱指针:它主要是通过弱引用计数来进行维护所指向对象的生命周期。

如果在一个类中使用了强指针或者弱指针的技术,那么这个类就必须从RefBase这个类进行做继承,因为强指针和弱指针是通过RefBase这个类来提供实现的引用计数器。

强指针和弱指针关系相对于轻量级指针来说更加亲密,因此他们一般是相互配合使用的。

AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。

Android 中的啥是三级缓存

三级缓存指的是:

网络缓存(顺序优先级最低)

本地缓存 (优先级次之)

内存缓存(优先级最高)

为啥使用三级缓存

我们的App 经常会需要进行网络交互,通过网络获取图片是非常正常的事情。如果每次启动的时候都从网络拉取图片的话,这会消耗很多流量。对于用户来讲,流量就意味着电话费,一个很耗流量的应用肯定会多花套餐钱,这样用户数量肯定要受到影响。

特别是当我们需要重复浏览加载一些图片时,如果每一次浏览都通过网络来获取加载,流量的浪费可想而知有多大。所以才提出三级缓存策略,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量。

三级缓存基本原理

首次加载 App 时,通过网络来获取图片,然后我们将图片保存至本地SD卡和内存中

之后运行 App 时,优先访问内存中的图片缓存,若内存中没有,再加载本地SD卡中的图片,若本地SD卡中也没有就从网络中加载。

如何使用三级缓存

内存缓存

Lru(Least rencently used) :近期最少使用算法。LruCache和DisLruCache两个类,分别用于内存和硬盘缓存。核心思想是当缓存空间满了之后,会删除最近最少使用的缓存。

LruCache
LruCache 是Android提供的缓存类,实现LRU算法,底层用LinkedHashMap来存储需要缓存的对象。这个类已经纳入到Android源码当中,一般被用来作为内存中的缓存使用。

DiskLruCache
顾名思义,这个类实现的是磁盘缓存。虽然它得到了Android官方文档的推荐,但目前并不属于Android SDK的一部分,所以我们发现像Glide和OkHttp这些开源框架里都用到了这个类,但都针对自己的情况作了修改。

垃圾回收原理

GC (Garbage Collection:即垃圾回收)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

● 对新生代的对象的收集称为minor GC

● 对老年代的对象的收集称为major GC

● 程序中主动调用System.gc()强制执行的GC为Full GC

Minor GC

Minor GC指新生代GC,即发生在新生代(包括Eden区和Survivor区)的垃圾回收操作,当新生代无法为新生对象分配内存空间的时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,所以发生Minor GC的频率很高,虽然它会触发stop-the-world,但是它的回收速度很快。

Major GC

Major GC清理Tenured区,用于回收老年代,出现Major GC通常会出现至少一次Minor GC。

Full GC

Full GC是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。Full GC不等于Major GC,也不等于Minor GC+Major GC,发生Full GC需要看使用了什么垃圾收集器组合,才能解释是什么样的垃圾回收。

不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

● 强引用:StrongReference 默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

● 软引用:SoftReference 软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

● 弱引用:WeakReference 在GC时一定会被GC回收

● 虚引用:PhantomReference 由于虚引用只是用来得知对象是否被GC

View类的setVisibility()方法设置是否显示组件。

有三个参数 : Parameters:visibility One of VISIBLE, INVISIBLE, or GONE,想对应的三个常量值:0、4、8

VISIBLE  :  0  意思是可见的

INVISIBILITY  :  4 意思是不可见的,但还占着原来的空间

GONE  :  8  意思是不可见的,不占用原来的布局空间

在android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法:1)AIDL 2)Broadcast 3)ContentProvider。

每个应用程序是可以实现数据共享的,对于每一个应用程序程序都拥有一个contentprovider实例进行存储,而contentresolver则是用于管理所有程序的contentprovider实例,通过contentrescolver可以获得数据,插入数据等……至于getcontentrescolver()就是获取实例。。。

如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:

1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;

2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);

3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。

<类名>::<类名>(){},即不执行任何操作。

new 一定要生成一个新对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;

2。new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。

如果是方法 就是一个方法名 就跟取名为a的方法是一样的,只是这个名称更具有意义,通常这种办法就是引用其他的数。。。。

单例模式,一般用于比较大,复杂的对象,只初始化一次,应该还有一个private的构造函数,使得不能用new来实例化对象,只能调用getInstance方法来得到对象,而getInstance保证了每次调用都返回相同的对象。

详细解释一下:对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等。
*直接使用new就不能实现好的,这时候需要使用间接使用new,即getInstance方法。这是一个设计方式的代表,而不仅仅指代一个方法名。

  1. new的使用:

    如Object _object = new Object(),这时候,就必须要知道有第二个Object的存在,而第二个Object也常常是在当前的应用程序域中的,
    可以被直接调用的

    1. GetInstance的使用:
      • 在主开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引用,即内存中有一块区域专门用来存放静态方法和变量,
      • 可以直接使用,调用多次返回同一个对象。

    3.两者区别对照:

    • 大部分类(非抽象类/接口/屏蔽了constructor的类)都可以用new,new就是通过生产一个新的实例对象,或者在栈上声明一个对象 ,每部分的调用
    • 用的都是一个新的对象。
    • getInstance是少部分类才有的一个方法,各自的实现也不同。
    • getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的访问点)的类中常见,用来生成唯一的实例,getInstance往往是static的。
    •  
      • (1) 对象使用之前通过getInstance得到而不需要自己定义,用完之后不需要delete;
    • (2)new 一定要生成一个新对象,分配内存;getInstance() 则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;
    • (3) new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。
    •  
      • 总结:
    • getInstance这个方法在单例模式用的甚多,为了避免对内存造成浪费,直到需要实例化该类的时候才将其实例化,所以用getInstance来获取该对象,
    • 至于其他时候,也就是为了简便而已,为了不让程序在实例化对象的时候,不用每次都用new,索性提供一个instance方法,不必一执行这个类就
    • 初始化,这样做到不浪费系统资源!单例模式 可以防止 数据的冲突,节省内存空间
  2. 调用顺序是从左至右

   其实就相当于new了一个 observeradapter的对象  用这个对象调用了register方法

                                      那明明 这最开始的这不就是ObserverAdapter,为什么还要再new一个  ObserverAdapter,来调用register呢?感觉略微有点多此一举了???

相当于一种初始化 你可以试一下你不new会报空指针的    

不是可以直接调用吗?

这就是编译时候经常会报的一个错误 

空指针  这我从c语言的角度来理解  就是你只是声明了一个指针 但是没有指向具体的地址 所以会报空  对趴

其实只要记住 调用其他类里面非静态方法需要new 这个类的对象 然后用这个对象去调用这个方法不然会报错 就行了 

然后 在java中 new就相当于指向地址的这一步骤?然后 getInstance也是差不多的意思

是的 没错

关于枚举还有很多用法  可能不止下面七种

 设计语言一般都会说枚举是从0开始的  但是我们也是可以定义枚举是从几开始的 

被新手忽视的枚举enum用法,竟如此强大! - 知乎

Java枚举(enum)常用的用法总结_OAK社区的博客-CSDN博客_java枚举类型enum用法

Java中枚举类型(Enum)使用进阶 - 知乎

这个enum 的ordinal方法,就是按照按照顺序返回对应的值

Enum类ordinal()方法

  • ordinal() 方法可在java.lang包。
  • ordinal() 方法用于返回此枚举常量的位置是其枚举声明中定义的任何内容,并且枚举常量的起始元素的位置从 0 开始。
  • ordinal() 方法是一个非静态方法,它只能通过类对象访问,如果我们尝试使用类名访问方法,那么我们将得到一个错误。
  • ordinal() 方法是最终方法,它不会在子类中覆盖。
  • 该方法在返回枚举常量的位置时不会抛出异常。

用法:

    public final int ordinal();

参数:

  • 它不接受任何参数。

返回值:

这个方法的返回类型是int,它返回这个枚举常量的位置。

就是意思如果我定义从100开始 那我调用这个ordinal应该返回的也是100吧?  还是0呢?

不是100 是返回0

枚举类的函数使用

  1. Weekday.valueOf() 方法:

    它的作用是传来一个字符串,然后将它转变为对应的枚举变量。前提是你传的字符串和定义枚举变量的字符串一抹一样,区分大小写。如果你传了一个不存在的字符串,那么会抛出异常。

  2. Weekday.values()方法。

    这个方法会返回包括所有枚举变量的数组。在该例中,返回的就是包含了七个星期的Weekday[]。可以方便的用来做循环。

  3. 枚举变量的toString()方法。

    该方法直接返回枚举定义枚举变量的字符串,比如MON就返回【”MON”】。

  4. 枚举变量的.ordinal()方法。

    默认请款下,枚举类会给所有的枚举变量一个默认的次序,该次序从0开始,类似于数组的下标。而.ordinal()方法就是获取这个次序(或者说下标)

  5. 枚举变量的compareTo()方法。

    该方法用来比较两个枚举变量的”大小”,实际上比较的是两个枚举变量的次序,返回两个次序相减后的结果,如果为负数,就证明变量1”小于”变量2 (变量1.compareTo(变量2),返回【变量1.ordinal() - 变量2.ordinal()

  6. compareTo源码

    这是compareTo的源码,会先判断是不是同一个枚举类的变量,然后再返回差值。

  7. 枚举类的name()方法。

    它和toString()方法的返回值一样,事实上,这两个方法本来就是一样的: 
    name方法

    toString方法

要点:

  • 使用的是enum关键字而不是class。 
     
  • 多个枚举变量直接用逗号隔开。 
     
  • 枚举变量最好大写,多个单词之间使用”_”隔开(比如:INT_SUM)。 
     
  • 定义完所有的变量后,以分号结束,如果只有枚举变量,而没有自定义变量,分号可以省略(例如上面的代码就忽略了分号)。 
     
  • 在其他类中使用enum变量的时候,只需要【类名.变量名】就可以了,和使用静态变量一样。

泛型:就是指在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象)再进行类型的定义。会在编译期检查类型是否错误。

类声明后的<>中这个T被称为类型参数,用于指代任意类型,实际上这个T只是个代表,写什么都可以。表示此时的value1,value2都是在类定义时没有明确类型,只有在使用时才告知编译器类型。出于规范,类型参数用单个的大写字母来代替,常见如下:

T:代表任意类
E:表示Element的意思,或是异常
K:与V搭配使用
V:与K搭配使用
 

 

 其实就可以解决你刚才那个问题了  Integer类型在-128–>127大于这个范围 将会重新创建一个Integer对象 也就是new一个对象出来 地址就不同了 用==比较的是地址 所以用==是false

  1. ==:既可以判断基本类型,又可以判断引用类型
  2. ==:如果判断的是基本类型,判断的是是否相等。示例: int i=10; double d=10.0;
  3. ==:如果判断的是引用类型,判断的是地址是否相等,即判定是不是同一个对象

equals: 是Object类中的方法,只能判断引用类型。
Object 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如
lnteger,String【看看String和 Integer的equals源代码】


Object 类中的 equals 方法
//Object 的equals方法默认就是比较对象的地址是否相同,也就是判断两个对象是不是同一个对象
public boolean equals(Object obj) { 
    return (this == obj);
}
原文链接:https://blog.csdn.net/qq_41684621/article/details/121207020

总结:这个东西就靠感觉 比如最常见int  两个相等 不管是== 还是equals 肯定是相等的,new 对象 字符串啥一类的 就==就是比较地址,因为equals平常比较的应该也就是字符串。原因在于string类重写了equals方法。

java_setTag()与getTag()的使用介绍

在写listView 时候要重写BaseAdapter

需要在没个item都加上button 点击button做相应操作

这个时候需要button里面设置下 这行的属性

button.setTag(item.user.name);

然后处理button事件。

这个东西在一些需要用到Adapter自定控件显示方式的时候非常有用

Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用

View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。

  可以用在每个Button添加一个监听器,每个Button都设置不同的setTag。这个监听器就通过getTag来分辨是哪个Button 被按下。


intValue()的用法

java.math.BigInteger.intValue()将此BigInteger转换为int。 此转换类似于从long到int的缩小基元转换。

如果此BigInteger太大而无法放入int,则仅返回低位32位。 此转换可能会丢失有关BigInteger值的总体大小的信息,并返回具有相反符号的结果。

HandlerThread

   RadioButton spinner 控件   下拉框的作用

这个是

RadioButton的setChecked这个方法

怎么回事呢?这就是String类的特殊之处了,new出来的String不再是上面的字符串常量,而是字符串对象。

由于String类是不可改变的,所以String对象也是不可改变的,我们每次给String赋值都相当于执行了一次new String(),然后让变量指向这个新对象,而不是在原来的对象上修改。

当然,java还提供了StringBuffer类,这个是可以在原对象上做修改的。如果你需要修改原对象,那么请使用StringBuffer类。
————————————————
版权声明:本文为CSDN博主「Sharember」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31655965/article/details/53365564

//加载布局管理器

LayoutInflater inflater = LayoutInflater.from(context);

//将xml布局转换为view对象

convertView = inflater.inflate(R.layout.item_myseallist,parent, false);

//利用view对象,找到布局中的组件

convertView.findViewById(R.id.delete);// 删除

1对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

3、 2对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

4、 获得布局填充器实例的三种方式

5、 1.LayoutInflates Inflates=getLayoutInflater(),/调用活动的getLayoutInflates()

6、 2.LayoutInflates inflates=layoutinflater . from(context);

7、 3.LayoutInflates inflater=(LayoutInflater)context . getsystem service

8、 (上下文。LAYOUT _ INFLATER _ SERVICE);

9、 结论:所以这三种方式最终本质是都是调用的Context.getSystemService().

10、 另外getSystemService()是机器人很重要的一个API,它是活动的一个方法,根据传入的名字来取得对应的对象,然后转换成相应的服务对象。

11、 示意代码:

12、 LayoutInflates Inflates=(LayoutInflater)getsystem SERVICE(LAYOUT _ INFLATER _ SERVICE);

13、 view view=inflater . inflate(r . layout . custom,(view group)findViewById(r . id . test));

14、 EditText EditText=(EditText)findViewById(r . id . content);//错误

15、 EditText EditText=(EditText)view . findviewbyid(r . id . content);

16、 对于上面代码,指定了第二个参数视图组根,当然你也可以设置为零值。

17、 注意:

18、 膨胀方法与初始化方法不同;

19、 膨胀是用来找分辨率/布局下的可扩展标记语言布局文件,并且实例化;

20、 findViewById()是找具体可扩展标记语言布局文件中的具体小部件控件(如:按钮/文本视图等)。

Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别
如果你不带参数的实例化:Handler handler = new Handler();那么这个会默认用当前线程的looper
一般而言,如果你的Handler是要来刷新操作UI的,那么就需要在主线程下跑。
情况:
1.要刷新UI,handler要用到主线程的looper。那么在主线程 Handler handler = new Handler();,如果在其他线程,也要满足这个功能的话,要Handler handler = new Handler(Looper.getMainLooper());
2.不用刷新ui,只是处理消息。 当前线程如果是主线程的话,Handler handler = new Handler();不是主线程的话,Looper.prepare(); Handler handler = new Handler();Looper.loop();或者Handler handler = new Handler(Looper.getMainLooper());
若是实例化的时候用Looper.getMainLooper()就表示放到主UI线程去处理。
如果不是的话,因为只有UI线程默认Loop.prepare();Loop.loop();过,其他线程需要手动调用这两个,否则会报错。
 

message.what,message.arg1,message.arg2,message.obj,他们在之间有什么区别呢?

what就是一般用来区别消息的,比如你传进去的时候msg.what = 3;
然后处理的时候判断msg.what == 3是不是成立的,是的话,表示这个消息是干嘛干嘛的(自己能区别开)


至于arg1,arg2,其实也就是两个传递数据用的,两个int值,看你自己想要用它干嘛咯。如果你的数据只是简单的int值,那么用这两个,比较方便。


其实这里你还少说了个,setData(Bundle),上面两个arg是传递简单int的,这个是传递复杂数据的。


msg.obj呢,这个就是传递数据了,msg中能够携带对象,在handleMessage的时候,可以把这个数据取出来做处理了。不过呢,如果是同一个进程,最好用上面的setData就行了,这个一般是Messenger类来用来跨进程传递可序列化的对象的,这个比起上面的来,更消耗性能一些。

http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13.html

两篇不错的文章:

http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445395.html

http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445355.html

Handler sendMessage 与 obtainMessage (sendToTarget)比较 - android007 - 博客园

所以以后使用的时候尽量使用 Message msg = handler.obtainMessage();的形式创

   建Message,不要自己New Message 至于message产生之后你使用obtainMessage 或者是 sendMessage 效率影响

   并不大.同时我们也要注意以后谈论性能的时候要找准位置,譬如这里性能的问题不是在调用 obtainMessage 和 sen

  dMessage 的方法上,而是调用他们之前对象的创建问题上。

 复写其实就是重写

TranslateAnimation详解  

Lifecycle是Android中引入的主要用来观察和监听Activity、Fragment生命周期的一套观察者机制。这个机制中有两个核心类,一个是LifecycleOwner接口,该接口有一个getLifecycle()方法

函数onCreateOptionsMenu()为创建Menu菜单的项目  第一次创建使用

onPrepareOptionsMenu(Menumenu)方法 动态修改。 后续修改添加等

在android中创建菜单menu时需要重写Activity的onCreateOptionsMenu(Menumenu)方法,这个方法只在第一次创建的时候调用一次,所以如果之后想对menu进行动态的修改,那么就不能再对onCreateOptionsMenu做什么手脚,就要用到onPrepareOptionsMenu(Menumenu)方法了。

onPrepareOptionsMenu与onCreateOptionsMenu不同的是,他在每次按下menu硬键之前会被调用,所以可以在这里动态的改变menu。

注意:在onPrepareOptionsMenu(Menumenu)函数中,首先需要调用:

super.onPrepareOptionsMenu(menu);

menu.clear();

如果没有clear而直接add的话,那么菜单中菜单项是会“追加”的,这样随着你不停的点menu键,菜单项就不停的增加。

另外,android系统默认的菜单样式是支持最多3个一行,如果有4项就每行2个有2行...如果想自定义样式,可以使用xml文件定义样式。

函数onOptionsItemSelected()为处理菜单被选中运行后的事件处理

通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。在AndroidManifest.xml中添加上诉代码的含义是表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged()。

 https://www.jianshu.com/p/2c9bcbf092bc  Android-Lifecycle超能解析-生命周期的那些事儿

PathInterpolator

ValueAnimator drawChild()

ViewOutlineProvider

   java  ::   
  Java中::的用法_地平线上的新曙光的博客-CSDN博客_java中::

this:代表当前,在Activity当中就是代表当前的Activity,换句话说就是Activity.this在Activity当中可以缩写为this.this 是因为Activity 扩展了Context,其生命周期是Activity 创建到销毁;
getApplicationContext():生命周期是整个应用,应用摧毁,它才摧毁。getApplicationContext 取得的Context是和Application关联的生命周期是应用的创建到销毁.
getApplication():andorid 开发中共享全局数据;

getBaseContext()  返回由构造函数指定或setBaseContext()设置的上下文

getActivity():与this基本相同,在fragment中就不能用this只能用getActivity(),两者绑定的关系。

 注:  比如有一个全局的数据操作类,用到了context, 这个时候就要用到getApplicationContext , 而不是用ACtivity, 这就保证了,数据库的操作与activity无关.
————————————————
原文链接:https://blog.csdn.net/augfun/article/details/70768099

InputStream(字节输入流)是Java标准库提供的最基本的输入流。它在java.io这个包里,InputStream并不是一个接口而是一个抽象类,是所有抽象流的父类。其中最常用的两个子类为FileInputStream(文件输入流)和BufferedInputStream(缓冲输入流),那么FileInputStream与BufferedInputStream都有哪些区别呢?
一、FileInputStream(文件输入流)
FileInputStream就是从文件流中读取数据,创建一个FileInputStream的实例对象,相当于在磁盘和内存之间建立一个管道,对磁盘中的文件进行读(输入)操作。
注意:在创建对象的同时必须传入文件的路径
下面的代码分别演示了如何完整逐个字节读取和批量字节读取一个文件的所有字节。
二、BufferedInputStream(缓冲输入流)
BufferedInputStream是缓冲输入流,它继承于FilterInputStream。BufferedInputStream比FileInputStream的效率高,它的作用就是为另一个输入流添加一些和功能,例如,提供“缓冲功能”、支持“mark()标记”和“reset()重置方法”。BufferedInputStream其实就是在内存和磁盘之间通过字节数组(默认为8192)建立一个缓冲区,当要读取磁盘中的文件数据时,先通过FileInputStream从磁盘中读取数据,再分批将数据分批填入到缓冲区中。每当缓冲区的数据被读完,FileInputStream会在次填充数据缓冲区,直到读完文件数据。
注意:在创建对象时必须传入一个输入流对象
 

public static 

不加static修饰的成员是对象成员,归每个对象所有。

加static修饰的成员是类成员,可以由一个类直接调用,为所有对象共有。

 List的contains方法用于判断对象是否存在于列表中。

Android List、Set和Map的介绍和使用 - 大西瓜3721 - 博客园

有一个Map对象,这时候使用keySet()方法获取所有的key值  

LRU全称为Least Recently Used,即最近最少使用。

由于缓存容量是有限的,当有新的数据需要加入缓存,但缓存的空闲空间不足的时候,如何移除原有的部分数据从而释放空间用来放新的数据?

LRU算法就是当缓存空间满了的时候,将最近最少使用的数据从缓存空间中删除以增加可用的缓存空间来缓存新数据。

  • 首先设置了内部 LinkedHashMap 构造参数 accessOrder=true, 实现了数据排序按照访问顺序。
  • LruCache类在调用get(K key) 方法时,都会调用LinkedHashMap.get(Object key) 。
  • 如上述设置了 accessOrder=true 后,调用LinkedHashMap.get(Object key) 都会通过LinkedHashMap的afterNodeAccess()方法将数据移到队尾。

第一种方法--及时回收bitmap内存:

一般而言,回收bitmap内存可以用到以下代码

if(bitmap != null && !bitmap.isRecycled()){   
        bitmap.recycle();   
        bitmap = null;   
}   
System.gc();  
bitmap.recycle()方法用于回收该bitmap所占用的内存,接着将bitmap置空,最后,别忘了用System.gc()调用一下系统的垃圾回收器。

ValueAnimator.ofInt

 一般集合类都可用Iterator(迭代)来遍历

 迭代器使用的不是递归 是list数据循环实现遍历

Java迭代器源码解析 - 走看看  迭代器

在java中也是有递归的 调用递归的形式与c语言一样。

第一行代码复习:

原来依赖添加有三种:本地依赖(fileTree  我那种导包的形式(本地jar包和目录的导入))、
远程依赖(implementation 'androidx.recyclerview:recyclerview:1.1.0'这种形式的)还有库依赖(xompileproject(‘:库名 ’)  testCompile测试用例库)

在oncreate()的外面 输入logt,按下tab键  就会以当前类名为值自动生成tag常量

setcontentview是给当前活动加载布局的意思    setContentView源码分析_本人很懒zzz的博客-CSDN博客

在Androidfest中注册活动(且添加以下语句就是主活动

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

 混淆

 

 每个项目下都配置了gradle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值