Android の高度な面接の質問と回答の分析
おすすめ: 「2020 Android 面接質問まとめ [集]」
1. パフォーマンスの最適化
1. Android アプリケーションを最適化する方法パフォーマンス分析
Android のパフォーマンスは主に、応答速度と UI の更新速度に依存します。
ブログを参照してください: Android システム パフォーマンス チューニング ツールの紹介
まず、機能に時間がかかるという点では、TraceView というツールがあります。 androidsdk を使用して、時間のかかる機能を測定するために使用されます。
UI レイアウトの分析には 2 つの部分があります。1 つは階層ビューアーで、ビューのレイアウト レベルと各ビューの更新時間と読み込み時間を確認できます。
これにより、最も時間がかかるレイアウトとビューをすばやく見つけることができます。
もう 1 つのオプションは、ビューをカスタマイズしてビューのレベルを下げることです。
2. メモリ リークはどのような状況で発生しますか?
メモリ リークは難しい問題です。
メモリ リークはいつ発生しますか?メモリ リークの根本原因は、存続期間の長いオブジェクトが存続期間の短いオブジェクトを保持していることです。存続期間の短いオブジェクトは時間内に解放できません。
I. 静的コレクション クラスはメモリ リークを引き起こす
主にハッシュマップ、ベクトルなどです。これらのコレクションが静的コレクションの場合、時間内に null が設定されていなければ、これらのオブジェクトは常に保持されます。
II.remove メソッドはセット Objects.hash(firstName, lastName) を削除できません;
テスト後、ハッシュコードが変更された後は、削除する方法がありません。
III. オブザーバー リスナーを使用する場合、xxxlistener を追加することが多いですが、必要のない場合、xxxlistener を削除し忘れるとメモリリークが発生しやすくなります。
ブロードキャストは受信者の登録を解除しません
IV. データベース コンテンツプロバイダー、io、sokect などのさまざまなデータ リンクが閉じられていません。カーソル
V. 内部クラス:
Java の内部クラス (匿名内部クラス) は、ホスト クラスの強参照 this を保持します。
したがって、新しいスレッドなどのバックグラウンド スレッド操作の場合、スレッドが終了しない場合、アクティビティはリサイクルされません。
コンテキスト参照、TextView などがコンテキスト参照を保持します。静的なドローアブルがある場合、メモリは解放されません。
VI. シングルトン
シングルトンはグローバル静的オブジェクトであり、コピーされたクラス A を保持すると解放できずメモリ リークが発生します。
3. OOM 例外を回避する方法
まず、OOM とは何ですか?
プログラムが「大きな」メモリを適用する必要があるが、GC 操作を実行した後でも仮想マシンがそれを時間内に提供できない場合
これにより、OOM である OutOfMemoryException がスローされます。
Android の OOM についてはどうですか?
単一のアプリがシステム全体に及ぼす影響を軽減するために、Android はアプリごとにメモリ制限を設定します。
public void getMemoryLimited(Activity context) { ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); System.out.println(activityManager.getMemoryClass()); System.out.println(activityManager.getLargeMemoryClass()); System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024)); }
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192 09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 512 09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192
HTC M7実測、192M上限。 512M 通常の状況では 192M が上限ですが、Android では特殊な状況により、より大きな RAM の使用が許可されます。
OOM を回避する方法
メモリ オブジェクトの使用量を減らす
I.ハッシュマップの代わりに ArrayMap/SparseArray
II. Android で Enum
の使用を避けるIII. ビットマップのメモリ使用量を削減します
- inSampleSize: スケーリング比画像をメモリにロードする前に、大きな画像の不必要なロードを避けるために適切なスケーリング比を計算する必要があります。 。
- デコード形式: デコード形式、ARGB_8888/RBG_565/ARGB_4444/ALPHA_8 を選択します。大きな違いがあります。
IV. リソース イメージのサイズを削減します。大きすぎるイメージについては、セクションに分けてロードすることを検討してください。
メモリ オブジェクトの再利用
ほとんどのオブジェクトの再利用それらはすべてオブジェクト プール テクノロジを使用します。
I.listview/gridview/recycleview contentview再利用
II.inBitmap属性のメモリオブジェクトARGB_8888/RBG_565/ARGB_4444/ALPHA_8
このメソッドは、特定のITで使用されます。は、数千の画像をロードする場合など、特定の条件下で非常に役立ちます。
III.ondraw メソッドで新しいオブジェクトを避ける
IV.StringBuilder の代わりに
4.Android でキャッチされなかった例外をキャッチする方法
public class CrashHandler implements Thread.UncaughtExceptionHandler { private static CrashHandler instance = null; public static synchronized CrashHandler getInstance() { if(instance == null) { instance = new CrashHandler(); } return instance; } public void init(Context context) { Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("Thread:"); stringBuilder.append(thread.toString()); stringBuilder.append("\t"); stringBuilder.append(ex); TraceLog.i(stringBuilder.toString()); TraceLog.printCallStatck(ex); } }
CrashHandler
重要なのは、Thread.UncaughtExceptionHandler
を実装し、それをアプリケーションの作成時に登録することです。
5.ANRとは何ですか? ANR の回避方法と解決方法 (重要)
ANR->Application Not Responding
つまり、指定された時間内に応答がありません。
3 つのタイプ:
1). KeyDispatchTimeout(5 秒) -- 主要なタイプのキーまたはタッチ イベントが特定の時間内に応答しません
2).BroadcastTimeout (10 秒) --BroadcastReceiver は特定の時間内に処理できません
#3).ServiceTimeout(20 秒) --サービスは特定の時間内に処理できない可能性がありますタイムアウトになる理由: イベントが処理される可能性がなく、イベント処理タイムアウトが発生します。ANR を回避する方法ANR の鍵は処理タイムアウトです。 UI スレッド、BroadcastReceiver およびサービスのメイン スレッドでは避け、複雑なロジックと計算を処理する必要があります。 操作はワーク スレッドに任せます。 1) アクティビティ、oncreate および onresume で時間のかかる操作を実行しないようにします。2) onReceiver であまりにも多くの操作を実行しないようにします。3) インテント レシーバーで開始しないようにします。新しい画面を作成し、ユーザーが現在実行しているプログラムからフォーカスを奪うためのアクティビティ。4)尽量使用handler来处理UI thread & workthread的交互。
如何解决ANR
首先定位ANR发生的log:
04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstarted
CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用情况04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
从log可以看出,cpu在做大量的io操作。
所以可以查看io操作的地方。
当然,也有可能cpu占用不高,那就是 主线程被block住了。
6.Android 线程间通信有哪几种方式
1)共享变量(内存)
2)管道
3)handle机制
runOnUiThread(Runnable)
view.post(Runnable)
7.Devik 进程,linux 进程,线程的区别
Dalvik进程。
每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。
所以dalvik进程和linux进程是可以理解为一个概念。
8.描述一下 android 的系统架构
从小到上就是:
linux kernel,lib dalvik vm ,application framework, app
9.android 应用对内存是如何限制的?我们应该如何合理使用内存?
activitymanager.getMemoryClass() 获取内存限制。
关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。
10. 简述 android 应用程序结构是哪些
1)main code
2) unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.
google建议只把启动图片放入。
5)lib
6)color
11.请解释下 Android 程序运行时权限与文件系统权限的区别
文件的系统权限是由linux系统规定的,只读,读写等。
运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。
12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么
Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。
简单来说framework就是提供app生存的环境。
1)Activity在attch方法的时候,会创建一个phonewindow(window的子类)
2)onCreate中的setContentView方法,会创建DecorView
3)DecorView 的addview方法,会把layout中的布局加载进来。
13.多线程间通信和多进程之间通信有什么不同,分别怎么实现
线程间的通信可以参考第6点。
进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,
Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。
14.Android 屏幕适配
屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。
dp来适配屏幕,sp来确定字体大小
drawable-xxdpi, values-1280*1920等 这些就是资源的适配。
wrap_content,match_parent, 这些是view的自适应
weight,这是权重的适配。
15.什么是 AIDL 以及如何使用
Android Interface Definition Language
AIDL是使用bind机制来工作。
参数:
java原生参数
String
parcelable
list & map 元素 需要支持AIDL
16.Handler 机制
参考:android 进程/线程管理(一)----消息机制的框架 这个系类。
17.事件分发机制
android 事件分发机制
18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么
EventBus,广播,view.post, runinUiThread
但是无论各种花样,本质上就2种:handler机制 + 广播
19.子线程中能不能 new handler?为什么
必须可以。子线程 可以new 一个mainHandler,然后发送消息到UI Thread。
20.Android 中的动画有哪几类,它们的特点和区别是什么
视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。
属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0
帧动画,通过drawable一帧帧画出来。
Gif动画,原理同上,canvas画出来。
具体可参考:https://i.cnblogs.com/posts?categoryid=672052
21.如何修改 Activity 进入和退出动画
overridePendingTransition
22.SurfaceView & View 的区别
view的更新必须在UI thread中进行
surfaceview会单独有一个线程做ui的更新。
surfaceview 支持open GL绘制。
二、项目框架的使用
23.开发中都使用过哪些框架、平台
I.EventBus 事件分发机制,由handler实现,线程间通信
II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
III.百度地图
IV.volley
V.fastjson
VI.picciso
VII.友盟
VIII.zxing
IX.Gson
24.使用过那些自定义View
pull2RefreshListView
25.自定义控件:绘制圆环的实现过程
package com.joyfulmath.samples.Cycle;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;/** * Created by Administrator on 2016/9/11 0011. */public class CycleView extends View { Paint mPaint = new Paint(); public CycleView(Context context) { this(context, null); } public CycleView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(100,100,50,mPaint); } }
CycleView
关键是canvas.drawCycle & paint.setsytle(stoken)
26.自定义控件:摩天轮的实现过程
27.GridLayout的使用
可以不需要adapter
28.流式布局的实现过程
TBD.
29.第三方登陆
QQ & 微信都有第三方登陆的sdk,要去注册app
30.第三方支付
需要看支付宝的API文档
以上がAndroid の高度な面接の質問と回答の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









この記事では、functionコンポーネントでのデータフェッチやDOM操作などの副作用を管理するためのフックであるReactの使用Effectについて説明します。メモリリークなどの問題を防ぐための使用、一般的な副作用、およびクリーンアップについて説明します。

怠zyな読み込みは、必要になるまでコンテンツの読み込みを遅延させ、初期負荷時間とサーバーの負荷を削減することにより、Webパフォーマンスとユーザーエクスペリエンスを改善します。

この記事では、Virtual DOMツリーを比較してDOMを効率的に更新するReactの調整アルゴリズムについて説明します。パフォーマンスの利点、最適化技術、ユーザーエクスペリエンスへの影響について説明します。

この記事では、JavaScriptのカレーについて説明します。これは、マルチアーグメント関数を単一argument関数シーケンスに変換する手法です。 Curryingの実装、部分的なアプリケーションなどの利点、実用的な用途、コード読み取りの強化を調査します

JavaScriptの高次関数は、抽象化、共通パターン、および最適化技術を通じて、コードの簡潔さ、再利用性、モジュール性、およびパフォーマンスを強化します。

この記事では、ReactのUseContextを説明しています。これにより、小道具掘削を避けることで国家管理を簡素化します。再レンダーの削減により、集中状態やパフォーマンスの改善などの利点について説明します。

記事では、Connect()、MapStateToprops、MapDispatchToprops、およびパフォーマンスへの影響を説明するReduxストアに反応コンポーネントをReduxストアに接続します。

記事では、PreventDefault()メソッドを使用して、イベントハンドラーのデフォルト動作の防止、ユーザーエクスペリエンスの強化などの利点、およびアクセシビリティの懸念などの潜在的な問題について説明します。
