android面试常见的handler机制 AIDL机制 高级控件UI 内存优化

大憨熊 提交于 2019-12-03 21:50:25

1,handler机制   在android中的一个异步回调,一个handler允许发送和处理message和runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及线程messageQueue相关联。每一个消息都要制定一个handler,通过Handler创建消息便可以完成此功能,将引入到消息队列中。UI主线程创建一个handler是通过threadlocal创建一个looper,这个looper和主线程一一对应,使用threadlocal是保证每一个线程唯一个looper,可以直接使用,初始化looper的时候创建一个messageQueue,主线程,消息循环,消息队列。Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。

2,AIDL android interface define language 

是进程间的通信,activity和service之间和在不同service之间的通信。IPC机制是面向接口的,它是使用代理类在客户端和实现端传递数据,使用AIDL实现IPC服务的步骤是:1. 创建.aidl文件-该文件(YourInterface.aidl)定义了客户端可用的方法和数据的接口。2. 在makefile文件中加入.aidl文件-(Eclipse中的ADT插件提供管理功能)Android包括名为AIDL的编译器,位于tools/文件夹。3. 实现接口-AIDL编译器从AIDL接口文件中利用Java语言创建接口,该接口有一个继承的命名为Stub的内部抽象类(并且实现了一些IPC调用的附加方法),要做的就是创建一个继承于YourInterface.Stub的类并且实现在.aidl文件中声明的方法。4. 向客户端公开接口-如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例。

3,android自定义view的实现方法

自定义View的实现方式大概可以分为三种,自绘控件、组合控件、以及继承控件,有时候在做开发的时候,android提供给我们的视图并不能满足我们的要求,所以有时候我们需要自己创建自己的view。 我们只需要将我们想要的继承于View,然后重写里面的方法就可以了。

package com.example.view;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;

public class MyTextView extends TextView {

 public MyTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  this.setTextColor(Color.BLUE);// 将字体设置成蓝色
 }

}

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.myviewtest01
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />

</RelativeLayout>


package com.example.myviewtest;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.TextView;

public class MyTextView extends TextView {

 public MyTextView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  // TODO Auto-generated constructor stub
 }

 public MyTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.MyTextView);
  String name = ta.getString(R.styleable.MyTextView_fontSize);
  System.out.println("name=" + name);
  this.setTextSize(ta.getDimension(R.styleable.MyTextView_fontSize, 10));
 }

 public MyTextView(Context context) {
  super(context);
  
 }

 

}

4,android内存优话

JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

 i.    强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

  ii.    软引用(SoftReference)如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

  iii.    弱引用(WeakReference)在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

   iv.    虚引用(PhantomReference)顾名思义,就是形同虚设。与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。了解并熟练掌握这4中引用方式,选择合适的对象应用方式,对内存的回收是很有帮助的。

android adapter中的getview缓存列表,bitmap缓存清理,数据库的cursor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!