Skip to content

Commit

Permalink
2016年9月20日16:13:34
Browse files Browse the repository at this point in the history
  • Loading branch information
HaoyangShi committed Sep 20, 2016
1 parent 2616ded commit 936ab35
Show file tree
Hide file tree
Showing 12 changed files with 127 additions and 19 deletions.
5 changes: 4 additions & 1 deletion SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
* [Volatile原理](java/volatile.md)
* [Synchronized原理](java/synchronized.md)
* [ConcurrentHashmap](java/concurrenthashmap.md)
* [Threadlocal原理](java/threadlocal.md)
* [RxJava](java/rxjava.md)
* [面试题](java/questions.md)
* [Android开发](android/README.md)
* [Android系统架构](android/arch.md)
Expand All @@ -60,16 +62,17 @@
* [Android中Handler机制](android/handler.md)
* [Android广播机制](android/broadcast.md)
* [View绘制过程](android/draw.md)
* [Canvas使用](android/canvas.md)
* [事件分发机制](android/event.md)
* [Binder](android/binder.md)
* [性能优化](android/optimize.md)
* [推送机制](android/push.md)
* [进程保活](android/keep-live.md)
* [Activity、View及Window之间关系](android/activity-view-window.md)
* [EventBus](android/eventbus.md)
* [OkHttp](android/okhttp.md)
* [Intent](android/intent.md)
* [版本问题](android/version.md)
* [面试题](android/questions.md)
* [Spring](Spring/spring.md)
* [基础](Spring/base.md)

8 changes: 8 additions & 0 deletions android/canvas.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Canvas使用

- **save**:用来保存 Canvas 的状态。save 之后,可以调用 Canvas 的平移、放缩、旋转、错切、裁剪等操作。

- **restore**:用来恢复Canvas之前保存的状态。防止 save 后对 Canvas 执行的操作对后续的绘制有影响。


save 和 restore 要配对使用( restore 可以比 save 少,但不能多),如果 restore 调用次数比 save 多,会引发 Error 。save 和 restore 之间,往往夹杂的是对 Canvas 的特殊操作。
2 changes: 1 addition & 1 deletion android/intent.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ Intent 分为两种类型:

- Intent 类别

下文根据如何在应用的清单文件中声明 Intent 过滤器,描述 Intent 如何与相应的组件匹配。
系统通过将 Intent 与所有这三个元素进行比较,根据过滤器测试隐式 Intent。**隐式 Intent 若要传递给组件,必须通过所有这三项测试。如果 Intent 甚至无法匹配其中任何一项测试,则 Android 系统不会将其传递给组件**。但是,由于一个组件可能有多个 Intent 过滤器,因此未能通过某一组件过滤器的 Intent 可能会通过另一过滤器。(在Demo中实验了几次,发现 Action 和 Data 必须至少设置一个,否则不能匹配到)

### 操作(Action)匹配

Expand Down
9 changes: 9 additions & 0 deletions android/launchmod.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,26 @@

![](android-lanchmode-singletop.gif)

适合接收通知启动的内容显示页面,或者从外界可能多次跳转到一个界面。

## SingleTask

栈内复用模式。这种模式下,只要Activity只要在一个栈内存在,那么就不会创建新的实例,会调用`onNewIntent()`方法。

- 如果要调用的Activity在同一应用中:调用singleTask模式的Activity会清空在它之上的所有Activity。

- 若其他应用启动该Activity:如果不存在,则建立新的Task。如果已经存在后台,那么启动后,后台的Task会一起被切换到前台。

![](android-lanchmode-singletask.gif)

适合作为程序入口点,例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。

## SingleInstance

单实例模式。这时一种加强的singleTask,它除了具有singleTask的所有特性外,还加强了一点--该模式的Activity只能单独的位于一个Task中。

>不同Task之间,默认不能传递数据(`startActivityForResult()`),如果一定要传递,只能使用Intent绑定。
![](android-lanchmode-singleinstance.gif)

适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。
3 changes: 3 additions & 0 deletions android/okhttp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# [OkHttp](http://www.jianshu.com/p/aad5aacd79bf)

具体内容在 Pocket
65 changes: 65 additions & 0 deletions android/questions.md
Original file line number Diff line number Diff line change
Expand Up @@ -317,3 +317,68 @@ TextView通常用来显示普通文本,但是有时候需要对其中某些文
### SQLiteOpenHelper.onCreate() 调用时机?

在调`getReadableDatabase``getWritableDatabase`时,会判断指定的数据库是否存在,不存在则调`SQLiteDatabase.onCreate`创建, `onCreate`只在数据库第一次创建时才执行。

***

### Removecallback 失效?

Removecallback 必须是同一个Handler才能移除。

***

### Toast 如果会短时间内频繁显示怎么优化?

```Java
public void update(String msg){
toast.setText(msg);
toast.show();
}
```

***

### Notification 如何优化?

可以通过 相同 ID 来更新 Notification 。

***

### 应用怎么判断自己是处于前台还是后台?

主要是通过 `getRunningAppProcesses()` 方法来实现。

```Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(getPackageName())) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
Log.d(TAG, String.format("Foreground App:%s", appProcess.processName));
} else {
Log.d(TAG, "Background App:" + appProcess.processName);
}
}
}
```

***

### FragmentPagerAdapter 和 FragmentStateAdapter 的区别?

`FragmentStatePagerAdapter``PagerAdapter` 的子类,这个适配器对实现多个 `Fragment` 界面的滑动是非常有用的,它的工作方式和listview是非常相似的。当Fragment对用户不可见的时候,整个Fragment会被销毁,只会保存Fragment的保存状态。基于这样的特性,`FragmentStatePagerAdapter``FragmentPagerAdapter` 更适合用于很多界面之间的转换,而且消耗更少的内存资源。

***

### Bitmap的本质?

本质是 SkBitmap 详见 Pocket

***

### SurfaceView && View && GLSurfaceView

- `View`:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;**必须在UI主线程内更新画面,速度较慢**

- `SurfaceView`:基于view视图进行拓展的视图类,更适合2D游戏的开发;**View的子类,类似使用双缓机制,在新的线程(也可以在UI线程)中更新画面所以刷新界面速度比 View 快**,但是会涉及到线程同步问题。

 - `GLSurfaceView`:openGL专用。基于SurfaceView视图再次进行拓展的视图类,**专用于3D游戏开发的视图**
2 changes: 1 addition & 1 deletion basic/database/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@

4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。

5. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。例如,使用`<>``not in``not` `exist`,对于这三种情况大多数情况下认为结果集很大,MySQL就有可能不使用索引。
5. 如果 mysql 估计使用全表扫描要比使用索引快,则不使用索引。例如,使用`<>``not in``not` `exist`,对于这三种情况大多数情况下认为结果集很大,MySQL就有可能不使用索引。

## 索引设计的原则

Expand Down
4 changes: 3 additions & 1 deletion basic/database/questions.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ mysql日志一般分为5种
### 主键和唯一键有什么区别?

- 主键不能重复,不能为空,唯一键不能重复,可以为空。

- 建立主键的目的是让外键来引用。

- 一个表最多只有一个主键,但可以有很多唯一键。
Expand All @@ -59,3 +59,5 @@ mysql日志一般分为5种
- 无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。
- `NULL` 值可以使用 `<=>` 符号进行比较,该符号与等号作用相似,但对`NULL`有意义。
- 进行 count ()统计某列的记录数的时候,如果采用的 NULL 值,会别系统自动忽略掉,但是空值是统计到其中。

***
23 changes: 16 additions & 7 deletions java/questions.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,13 +205,19 @@ fabs(x) < 0.00001f

### 你知道哪些JDK中用到的设计模式?

* 装饰模式:java.io
* 单例模式:Runtime类
* 简单工厂模式:Integer.valueOf方法
* 享元模式:String常量池、Integer.valueOf\(int i\)、Character.valueOf\(char c\)
* 迭代器模式:Iterator
* 职责链模式:ClassLoader的双亲委派模型
* 解释器模式:正则表达式java.util.regex.Pattern
* 装饰模式:java.io

* 单例模式:Runtime类

* 简单工厂模式:Integer.valueOf方法

* 享元模式:String常量池、Integer.valueOf\(int i\)、Character.valueOf\(char c\)

* 迭代器模式:Iterator

* 职责链模式:ClassLoader的双亲委派模型

* 解释器模式:正则表达式java.util.regex.Pattern


---
Expand Down Expand Up @@ -293,4 +299,7 @@ CAS作为知名无锁算法,那ConcurrentHashMap就没用锁了么?当然不

- XX:+PrintGCDetails 收集器日志参数


***

### 如何打破 ClassLoader 双亲委托?
2 changes: 2 additions & 0 deletions java/rxjava.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# RxJava

18 changes: 10 additions & 8 deletions java/thread.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,24 +44,26 @@ Java中的线程都是调用的原生系统的本地函数,Java线程模型是

线程调度分为协同式和抢占式。

* `协同式调度`:线程的执行时间由线程自己控制,这种的实现很简单,但是很可能造成很严重的后果。
* `抢占式调度`:由操作系统分配线程执行的时间,线程切换的决定权在操作系统。
* `协同式调度`:线程的执行时间由线程自己控制,这种的实现很简单,但是很可能造成很严重的后果。
* `抢占式调度`:由操作系统分配线程执行的时间,线程切换的决定权在操作系统。

有时候我们需要为某些线程多分配时间,这时我们就需要用到线程优先级的方法,Java提供了10种优先级。Java优先级是在操作系统的原生线程优先级上实现的,所以对于同一个优先级,不同的操作系统可能有不同的表现,也就是说 **Java线程优先级不是可靠的**

## Java线程状态切换

Java线程模型定义了 6 种状态,在任意一个时间点,一个线程有且只有其中一个状态:

* `新建(New)`:新建的Thread,尚未开始。
* `运行(Runable)`:包含操作系统线程状态中的Running、Ready,也就是处于正在执行或正在等待CPU分配时间的状态。
* `无限期等待(Waiting)`:处于这种状态的线程不会被分配CPU时间,等待其他线程唤醒。
* `限期等待(Timed Waiting)`:处于这种状态的线程不会被分配CPU时间,在一定时间后会由系统自动唤醒。
* `阻塞(Blocked)`:在等待获得排他锁。
* `结束(Terminated)`:已终止的线程。
* `新建(New)`:新建的Thread,尚未开始。
* `运行(Runable)`:包含操作系统线程状态中的Running、Ready,也就是处于正在执行或正在等待CPU分配时间的状态。
* `无限期等待(Waiting)`:处于这种状态的线程不会被分配CPU时间,等待其他线程唤醒。
* `限期等待(Timed Waiting)`:处于这种状态的线程不会被分配CPU时间,在一定时间后会由系统自动唤醒。
* `阻塞(Blocked)`:在等待获得排他锁。
* `结束(Terminated)`:已终止的线程。

![](thread_4.jpg)

## 线程安全

多线程访问同一代码,不会产生不确定的结果。

## Java 线程池
5 changes: 5 additions & 0 deletions java/threadlocal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Threadlocal原理

ThreadLocal 为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

每个线程中都保有一个`ThreadLocalMap`的成员变量,`ThreadLocalMap `内部采用`WeakReference`数组保存,数组的key即为`ThreadLocal `内部的Hash值。

0 comments on commit 936ab35

Please sign in to comment.