个人工作日记
来源:互联网 发布:在华生活的日本人 知乎 编辑:程序博客网 时间:2024/06/12 00:57
1.EditText 添加gravity数据会影响到软键盘的设置,设置输入属性之后,软键盘遮挡输入框
2.---------------监听软键盘的显示隐藏------------------------------------------
//监听软键盘是否显示或隐藏(EditText的父容器)
mRelativeLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
mRelativeLayout.getWindowVisibleDisplayFrame(r);
int screenHeight = mRelativeLayout.getRootView()
.getHeight();
int heightDifference = screenHeight - (r.bottom);
if (heightDifference > 200) {
LL.e("显示");
//软键盘显示
// changeKeyboardHeight(heightDifference);
} else {
//软键盘隐藏
LL.e("隐藏");
hideEditText();
}
}
});
3.----------------------Serializable和Parcelable区别----------------------------
Serializable是Java中的序列化接口,其使用起来简单但是开销很大,在序列化和反序列化过程中需要大量的I/O操作。 而Parcelable是Android中的序列化方式,因此更适合用在Android平台上,它的缺点就是使用起来稍微麻烦点,但是它的效率很高。
本地永久性保存文件最好使用Serializable接口,因为Parcelable受到系统版本影响还有Parcelable的性能比Java自带的Serializable好
4.----------------------获取RecycleView的第一个和最后一个item的position-------------------------
private void getRecyclerViewScrolPosition(RecyclerView recyclerView) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
//判断是当前layoutManager是否为LinearLayoutManager
// 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
//获取最后一个可见view的位置
int lastItemPosition = linearManager.findLastVisibleItemPosition();
//获取第一个可见view的位置
mRecyclerViewFirstItemPosition = linearManager.findFirstVisibleItemPosition();
mRecyclerViewLastItemPosition = lastItemPosition;
LL.e("获取最后一个可见view的位置" + lastItemPosition + "获取第一个可见view的位置" + mRecyclerViewFirstItemPosition);
}
}
5 ---------------------------并发和并行的区别-----------------------------------
并行就是多个任务(线程)同时运行,就是甲任务进行的同时,乙任务也在进行,丙、丁任务等都在进行,当系统有一个以上CPU时,当一个CPU执行一个线程时, 另一个CPU可以执行另一个线程,多个线程互不抢占CPU资源,可以同时进行。
并发是指多个任务(线程)都请求运行,如果系统只有一个CPU,CPU只能按受一个任务,它把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程安排轮流进行,在一个时间段的线程代码运行时,其它线程处于挂起状态。由于时间间隔较短,使人感觉多个任务都在运行。
拿两个线程举例子:
比如我两只耳朵痒,我掏耳朵,两个耳朵一起掏,这就叫并行。
如果我先掏左耳朵,然后再给掏右耳朵,然后再掏左耳朵,再掏右耳朵。这就叫并发。
问题:多线程在多核上是并发还是并行?
我的理解:对于单核,多线程的多任务是在单cpu交替执行,属于并发;对于多核,多线程的任务如果能够分布在各个cpu上(线程数少许核心数),那么就是并行。
6.---------------------------TCP和UDP-------------------------------------
TCP是面向连接的一种传输控制协议。TCP连接之后,客户端和服务器可以互相发送和接收消息,在客户端或者服务器没有主动断开之前,连接一直存在,故称为长连接。
特点:连接有耗时,传输数据无大小限制,准确可靠,先发先至。
UDP是无连接的用户数据报协议,所谓的无连接就是在传输数据之前不需要交换信息,没有握手建立连接的过程,只需要直接将对应的数据发送到指定的地址和端口就行。
故UDP的特点是不稳定,速度快,可广播,一般数据包限定64KB之内,先发未必先至。
7.------------------------------------static--------------------------------
静态内部类只有使用的时候才会初始化,一个类的静态属性即static修饰的属性,在应用启动的时候就已经预加载了(初始化了)已在内存中的方法区中占有内存空间,在应用销毁的时候(清除内存空间)
何为静态?静态方法是类在加载时就被加载到内存中的方法,在整个运行过程中保持不变,因而不能重写。但非静态方法是在对象实例化时才单独申请内存空间,为每一个实例分配独立的运行内存,因而可以重写。
8.----------------------------volatile--------------------------------
说说你对 Java 的 volatile 关键字的理解和使用场景举例?
解析:
一旦一个并发共享变量(类的成员变量、静态成员变量)被 volatile 关键字修饰就具备了可见性(即一个线程修改了一个变量的值对于另一个线程来说是立即可见的)
和有序性(即禁止进行指令重排序),实质是在生成的汇编代码中多了一个 lock 前缀指令。 譬如我们经常会使用标记法中断线程,如下:
boolean stop = false;
//线程1
while(!stop){
//do some thread things...
}
//线程2
stop = true;
这段代码其实大多数时候是可以中断线程1的,但是依然存在一定小概率无法中断线程1,因为每个线程都有自己的工作内存,当线程1运行时会对主存的 stop 变量拷贝一份放置到自己的工作内存使用,当线程2更改了 stop 变量的值后还未来得及写回主存中而接着做其他事情了,此时线程1可能无法立即感知到 stop 变量的改变而无法中断自己造成错误的逻辑,当我们对 stop 变量添加 volatile 修饰符后就不会存在上面的问题了,因为 volatile 会强制线程修改变量的改变立即回写到主存中,当线程2修改 stop 变量值时会导致线程1的工作内存中 stop 缓存失效进而主动去主存中重新读取 stop 值。
volatile 有序性的保证有两层含义,当程序执行到 volatile 变量的读或者写操作时在其前面的操作的更改肯定已经全部进行且结果已经对后面的操作可见,在其后面的操作肯定还没有进行,在进行指令优化时不能将对 volatile 变量访问的语句放在其后面执行,也不能把 volatile 变量后面的语句放到其前面执行。
volatile 常见的使用场景为多线程自定义条件标记变量中断和单例模式的 double check 等。
9.-----------------ViewPager适配器--------------------------------
关于ViewPager适配器相关类:FragmentPagerAdapter与FragmentStatePagerAdapter
FragmentPagerAdapter:对于不再需要的fragment,选择调用detach方法,仅销毁视图,并不会销毁fragment实例。FragmentStatePagerAdapter:会销毁不再需要的fragment,当当前事务提交以后,会彻底的将fragment从当前Activity的FragmentManager中移除,state标明,销毁时,会将其onSaveInstanceState(Bundle outState)中的bundle信息保存下来,当用户切换回来,可以通过该bundle恢复生成新的fragment,也就是说,你可以在onSaveInstanceState(Bundle outState)方法中保存一些数据,在onCreate中进行恢复创建。
总结:使用FragmentStatePagerAdapter当然更省内存,但是销毁新建也是需要时间的。一般情况下,如果你是制作主页面,就3、4个Tab,那么可以选择使用FragmentPagerAdapter,
如果你是用于ViewPager展示数量特别多的条目时,那么建议使用FragmentStatePagerAdapter。
10------------------------父类的静态方法能被重写吗?----------------------------------
静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法也不在存在多态的性质。
Java不推荐用对象调用static方法,这会使人混淆,请大家注意。
这也是为什么abstract修饰的method是不可同时是static的原因:
abstract修饰方法,子类需要重写去实现,主要用于各个子类的实例对象;
static修饰方法,则方法不属于某个对象,属于class,可用class名.方法名(),进行调用;
简单的说abstract实例对象; 而static属于类。 所以static方法不能是abstract方法
因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说。(最后一句话是自己理解,不知道说的对不对,欢迎大家批评指正)
11--------------------------什么是ART?-----------------------------------
即Android Runtime
ART 的机制与 Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率, 而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速。
12-----------------------------什么是ANR?--------------------------------------
什么是ANR 如何避免它?答:在Android 上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR 给用户。不同的组件发生ANR 的时间不一样,主线程(Activity、Service)是5 秒,BroadCastReceiver 是10 秒。
解决方案:
将所有耗时操作,比如访问网络,Socket 通信,查询大量SQL 语句,复杂逻辑计算等都放在子线程中去,然后通过handler.sendMessage、runonUITread、AsyncTask 等方式更新UI。无论如何都要确保用户界面操作的流畅度。如果耗时操作需要让用户等待,那么可以在界面上显示进度条。
13 java中==和equal()的区别
一、比较基本数据类型(注:java中共有8大基本数据类型)
比较两个基本数据类型是否相等用 == ,因为只有类才有equal方法
二、比较引用数据类型
euqals和==本质上都是比较的是两个对象的引用(内存地址)是否相同。equals()是Object类的方法 ,
object类是所有类的基类,所以每个类都会继承equals()方法。
但在String,Integer,Date在这些类当中重写了equals方法,
而不再是比较对象在堆内存中的存放地址了,而是指向他们的值是否相同
String s1 = new String("123");
String s2 = new String("123");
String s3 = "abc";
String s4 = "abc";
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
int a = 1;
int b = 1;
System.out.println( s1==s2 );
System.out.println( s3==s4 );
System.out.println( i1==i2 );
System.out.println( a==b );
System.out.println( s1.equals(s1) );
System.out.println( s3.equals(s4) );
System.out.println( i1.equals(i2) );
结果:
false
true
false
true
true
true
true
14. -----------------------蓝牙ble开发问题 ---------------
如果在蓝牙连接的时候立刻断开蓝牙的搜索,会出现bug,会出现蓝牙假连接的问题,实际上蓝牙并没有连接上但是代码显示蓝牙已经连接成功,蓝牙连接回调也走了。 尽量避免在连接的时候断开蓝牙的搜索。
ble开发中必须检测手机是否开启用户权限,如果没有开启位置权限手机无法搜索到蓝牙设备(搜索不了)
阅读全文
0 0
- 个人工作日记
- 个人工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- 工作日记
- Codeforces 875E Delivery Club 妙哉!
- IFE-TASK25(任务二十五:JavaScript和树(四))
- 使用AndroidStudio编写第一个JNI程序
- C# 生成二维码图片(位深度可设) QRCode
- python 使用 jpype 调用java类
- 个人工作日记
- Ant的安装与使用
- OSPF理论
- ExpandableListView
- 网络编程笔记1_UDP和TCP
- AES 地址栏重要信息加密(JS 加密 Java 解密)
- 表格排序与DOM映射机制
- web.xml各版本头文件及与JDK、Tomcat版本对应关系
- Apicloud常见问题建议方案