今日では、中流階級のインタビューのトピックのいくつかを共有するいくつかの小さな植物の開発者のためのより適切な、表情で私をフォローします。
同様に、すべての知識では、以下のPDFについては、ビデオ。コードのソース。私の仕上げのための情報および注意事項の大半によってサポートされているコアPDFノート関心の
https://github.com/xiangjiana/androids
(より完全なプロジェクトのダウンロード。継続する。ソース。グラフィック知識、その後のアップロードgithubの。)
一次面接の話題(小さな植物)
1.メモリリークにつながる理由は何ですか?
メモリリークの根本的な原因:短いライフサイクルを保持するオブジェクトオブジェクトの長いライフサイクル。短周期のオブジェクトは、時間内に解放することはできません。
非静的内部クラス静的内部クラスとの間の差(メモリリークに起因するハンドラ)。
静的なコレクションは、メモリリークが発生します
シングルトンは、メモリリークを誘発しました。
解決:コンテキストがあるApplicationContext
によるApplicationContext
ライフサイクルとアプリが同じで、メモリリークが発生することはありません。
登録/原因と対になっていないメモリリークの利用登録を解除します。
オブジェクトのコレクションは、メモリリークをクリーンアップしませんでした。一部のオブジェクトは、通常のコレクションにロードされます、使用しないときは、関連するオブジェクトがもはや参照されるように、コレクションをクリーンアップしないために必ず覚えておいてください。
減少し、メモリ消費量のオブジェクト
-
ArrayMap/SparseArray
代替hashmap
-
アンドロイドの内部で使用しないでください
Enum
-
ビットマップメモリフットプリントを削減
-
inSampleSize
:スケーリングは、メモリへの絵の前に、我々は不要なロードに大きな画像を避けるために、適切なスケーリングを計算する必要があります。 - デコードフォーマット:フォーマットのデコードは、ARGB_8888 / RBG_565 / ARGB_4444 / ALPHA_8を選択し、大きな違いがあります。
-
- リソース画像のサイズを縮小、画像が大きすぎるセグメント化されたローディングと考えることができます
中2、理解活動、ビュー、ウィンドウの関係
这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater
像剪刀,Xml
配置像窗花图纸。
-
Activity构造的时候会初始化一个Window,准确的说是
PhoneWindow
。 -
这个
PhoneWindow
有一个“ViewRoot
”,这个“ViewRoot
”是一个View或者说ViewGroup
,是最初始的根视图。 -
ViewRoot
通过addView
方法来一个个的添加View。比如TextView
,Button等 - 这些View的事件监听,是由
WindowManagerService
来接受消息,并且回调Activity函数。比如onClickListener
,onKeyDown
等。
3、Handler的原理
所以就有了handler,它的作用就是实现线程之间的通信。
handler整个流程中,主要有四个对象,handler
,Message
,MessageQueue
,Looper
。当应用创建的时候,就会在主线程中创建handler对象,
我们通过要传送的消息保存到Message中,handler通过调用sendMessage
方法将Message发送到MessageQueue
中,Looper
对象就会不断的调用loop()方法
不断的从MessageQueue
中取出Message交给handler进行处理。从而实现线程之间的通信。
4、View,ViewGroup事件分发
- Touch事件分发中只有两个主角:
ViewGroup
和View
。ViewGroup
包含onInterceptTouchEvent
、dispatchTouchEvent
、onTouchEvent
三个相关事件。View包含dispatchTouchEvent
、onTouchEvent
两个相关事件。其中ViewGroup
又继承于View。
2.ViewGroup
和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup
。
3.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。
4.当Acitivty
接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup
的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent
结果返回true。
5.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup
中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。
由于子View是保存在ViewGroup
中的,多层ViewGroup
的节点结构时,上级ViewGroup
保存的会是真实处理事件的View所在的ViewGroup
对象:如ViewGroup0-ViewGroup1-TextView
的结构中,TextView
返回了true,它将被保存在ViewGroup1
中,而ViewGroup1
也会返回true,被保存在ViewGroup0
中。当Move和UP事件来时,会先从ViewGroup0
传递至ViewGroup1
,再由ViewGroup1
传递至TextView
。
6.当ViewGroup
中所有子View都不捕获Down事件时,将触发ViewGroup
自身的onTouch
事件。触发的方式是调用super.dispatchTouchEvent
函数,即父类View的dispatchTouchEvent
方法。在所有子View都不处理的情况下,触发Acitivity
的onTouchEvent
方法。
7.onInterceptTouchEvent
有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup
捕获Up和Move事件。
5、onNewIntent()什么时候调用?(singleTask)
6、mvc 和 mvp mvvm
MCP.MVVM项目实战代码.笔记
1.mvc:数据、View、Activity,View将操作反馈给Activity,Activitiy去获取数据,数据通过观察者模式刷新给View。循环依赖Activity,很难单元测试View和Model耦合严重
2.mvp:数据、View、Presenter,View将操作给Presenter,Presenter去获取数据,数据获取好了返回给Presenter,Presenter去刷新View。PV,PM双向依赖
3.mvvm:数据、View、ViewModel,View将操作给ViewModel,ViewModel去获取数据,数据和界面绑定了,数据更新界面更新。
-
viewModel的业务逻辑可以单独拿来测试
-
一个view 对应一个 viewModel 业务逻辑可以分离,不会出现全能类
- 数据和界面绑定了,不用写垃圾代码,但是复用起来不舒服
7、自定义控件
View的绘制流程:OnMeasure()——>OnLayout()——>OnDraw()
ステップ:OnMeasure()サイズ測定図。トップ親から子ビューへの表示は、再帰的方法、測定方法とコールバックOnMeasureを測定します。
ステップ2:OnLayout():ページレイアウトのためのOK表示の場所。レイアウトパラメータの測定子に応じて親子ビュー表示再帰的プロセス、即ち、親ビューのサイズおよびレイアウト上からView.layoutメソッド呼び出しは、正しい位置に子ビューを取得前のビュー。
第三段階:OnDraw():絵画図。Canvasオブジェクトを作成し、()OnDrawを呼び出しViewRoot。
6つのステップ:
①は、背景のビューを描画;
②、帆布層(レイヤー)を保存;
;ビューに内容を描画する、③
ないいない場合は、ビューの子ビューを描画する、④、
⑤、層(レイヤ)を低減。 ⑥、スクロールバーを描画します。
8違い、直列化とのParcelable
P少ないメモリ消費量
Sを持つプログラムP用いてネットワーク伝送
Sは、永続データ容易に
リフレクションを使用してSを容易に遅いガベージコレクションをトリガー