>  기사  >  웹 프론트엔드  >  안드로이드 고급 면접 질문과 답변 분석

안드로이드 고급 면접 질문과 답변 분석

藏色散人
藏色散人앞으로
2020-07-31 15:53:004646검색

추천: "2020 안드로이드 면접 질문 요약 [컬렉션] "

1. 성능 최적화

1. 안드로이드 애플리케이션에서 성능 분석을 수행하는 방법

안드로이드의 주요 성능은 응답 속도와 UI 새로 고침 속도입니다.

블로그를 참조할 수 있습니다: Android 시스템 성능 튜닝 도구 소개

우선, 기능 시간이 많이 걸린다는 측면에서, 기능 시간을 측정하는 데 사용되는 androidsdk에 내장된 TraceView 도구가 있습니다. 태워 버리는.

UI 레이아웃 분석은 두 부분으로 구성될 수 있습니다. 하나는 보기의 레이아웃 수준과 각 보기의 새로 고침 및 로드 시간을 볼 수 있습니다.

이렇게 하면 가장 오래 걸리는 레이아웃과 보기를 빠르게 찾을 수 있습니다.

또 다른 옵션은 보기를 사용자 정의하여 보기 수준을 줄이는 것입니다.

2. 어떤 상황에서 메모리 누수가 발생하나요?

메모리 누수는 어려운 문제입니다.

메모리 누수는 언제 발생하나요? 메모리 누수의 근본 원인: 수명이 짧은 개체를 보유하는 수명이 긴 개체입니다. 수명이 짧은 개체는 제때에 해제될 수 없습니다.

I. 정적 컬렉션 클래스로 인해 메모리 누수가 발생합니다.

주로 해시맵, 벡터 등입니다. 이러한 컬렉션이 정적 컬렉션인 경우 null이 시간에 설정되지 않으면 이러한 객체는 항상 유지됩니다.

II.remove 메소드는 Objects.hash(firstName, lastName) 세트를 삭제할 수 없습니다.

테스트 후 해시코드가 수정된 후에는 제거할 수 있는 방법이 없습니다.

III.observer 리스너를 사용할 때 xxxlistener를 추가하는 경우가 많지만, 필요하지 않을 때 xxxlistener를 제거하는 것을 잊어버리면 메모리 누수가 발생하기 쉽습니다.

방송이 수신자를 등록 취소하지 않습니다

IV. 다양한 데이터 링크가 닫히지 않습니다. 데이터베이스 콘텐츠 제공자, io, sokect 등. 커서

V. 내부 클래스:

Java의 내부 클래스(익명 내부 클래스)는 호스트 클래스에 대한 강력한 참조를 보유합니다.

따라서 새 스레드와 같은 백그라운드 스레드 작업인 경우 스레드가 끝나지 않으면 활동이 재활용되지 않습니다.

컨텍스트 참조, TextView 등은 컨텍스트 참조를 보유합니다. 정적 드로어블이 있으면 메모리가 해제되지 않습니다.

VI. 싱글톤

싱글톤은 복사된 클래스 A를 보유할 때 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));
    }
rrree

HTC M7 실제 측정, 상한은 192M입니다. 512M 일반적인 상황에서는 192M이 상한이지만, 일부 특수한 상황으로 인해 안드로이드에서는 더 큰 RAM 사용을 허용합니다.

OOM을 방지하는 방법

메모리 개체 사용량을 줄입니다

I. 해시맵 대신 ArrayMap/SparseArray

II. Android에서 Enum 사용을 피하세요

III.SampleSize: 스케일링 비율, 로드 전. 이미지를 메모리에 저장하려면 대용량 이미지를 불필요하게 로드하는 것을 방지하기 위해 적절한 크기 조정 비율을 계산해야 합니다.

    디코드 형식: 디코드 형식에서 ARGB_8888/RBG_565/ARGB_4444/ALPHA_8을 선택하면 큰 차이가 있습니다.
  • IV. 리소스 이미지의 크기를 줄이세요. 이미지가 너무 큰 경우 세그먼트로 로드하는 것을 고려하세요.
메모리 개체 재사용

대부분의 개체는 개체 풀 기술을 사용하여 재사용됩니다.
I.listview/gridview/recycleview contentview 재사용

II.inBitmap 메모리 개체 재사용을 위한 속성 ARGB_8888/RBG_565/ARGB_4444/ALPHA_8

이 방법은 수천 장의 사진을 로드하는 시간과 같은 특정 조건에서 매우 유용합니다.

III. ondraw 메서드에서 새 개체를 피하세요

IV.StringBuilder 대신 +

4. Android

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

CrashHandler

에서 포착되지 않은 예외를 잡는 방법은 Thread.UncaughtExceptionHandler

를 구현하는 것입니다. oncreate에 애플리케이션을 등록하세요.

5.ANR이란 무엇인가요? ANR 방지 및 해결 방법 (중요)

ANR->애플리케이션이 응답하지 않습니다

즉, 지정된 시간 내에 응답이 없습니다.

세 가지 유형:

1) KeyDispatchTimeout(5초) -- 주요 유형의 키 또는 터치 이벤트가 특정 시간 내에 응답하지 않습니다.

2) --BroadcastReceiver는 일정 시간 내에 처리할 수 없습니다. 특정 시간

3) ServiceTimeout(20초) - 특정 시간 내에 서비스 유형을 처리할 수 없는 가능성이 있습니다.

시간 초과 이유: 이벤트가 처리될 기회가 없습니다.

ANR을 피하는 방법

ANR의 핵심

처리 타임아웃이므로 UI ​​스레드, BroadcastReceiver 및 서비스 메인 스레드에서 복잡한 로직 및 계산 처리를 피하고 작업에 넘겨야 합니다. 작업용 스레드입니다.

1) oncreate 및 onresume에서 시간이 많이 소요되는 작업을 피하세요

2) onReceiver에서 너무 많은 작업을 수행하지 마세요

3) Intent Receiver에서 액티비티를 시작하지 마세요. 새 화면이 생성되고 도용되기 때문입니다. 현재 사용자가 실행 중인 프로그램에서 포커스를 받습니다.

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文档

위 내용은 안드로이드 고급 면접 질문과 답변 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제