Welcome to Ray's Blog

Stay Hungry Stay Foolish - Steve Jobs

0%

常用知识点笔记二

Android

1. AsyncTask超简述原理

  1. AsyncTask本质是一个静态的线程池(容量 128,执行数 5),AsyncTask派生出来的子类可以实现不同的异步任务,这些任务都是提交到静态线程池中执行的;
  2. 线程池中的工作线程mWorker执行doInBackground(mParams)方法执行异步任务;
  3. 当任务状态(执行成功、取消执行、进度更新)后,工作线程会向 UI 线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数;
  4. 不足处:线程池大小固定,如果添加线程数量超过固定值,则会抛出拒绝新线程的RejectedExcutionException。解决方式为新开一个线程,时刻关注线程池内线程数量,如果线程池线程满了,那么则休眠新线程,否则将线程添加到线程池中。
  5. 3.0 之前线程池是并行执行,3.0 之后通过SerialExcutor执行串行操作。真正的操作是在THREAD_POOL_EXCUTOR线程。如果想要强行并行执行,可以直接使用excuteOnExcutor方法即可;

2. 突破 65536 方法数限制超简述方式:分包(dex)方式

  1. 配置 Gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

defaultConfig {

applicationId "com.chenley.an.yutownhelper"

minSdkVersion 15

targetSdkVersion 23

...

multiDexEnabled true// dex突破65535的限制配置

}

//设置分包大小

dexOptions {

javaMaxHeapSize '4g'

}

//添加依赖

dependencies {

compile 'com.android.support:multidex:1.0.0'

}

  1. 自定义AppApplication extends MultiDexApplication
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

public class AppApplication extends MultiDexApplication {

@Override

public void onCreate() {

super.onCreate();

MyCrashHandler crashHandler = MyCrashHandler.getInstance();

crashHandler.init(getApplicationContext());

}

}

** MultiDexApplication extends Application **

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

package android.support.multidex;

import android.app.Application;

import android.content.Context;

import android.support.multidex.MultiDex;

public class MultiDexApplication extends Application {

public MultiDexApplication() {

}

protected void attachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);//支持分包处理核心代码

}

}

  1. 设置 AndroidManifest.xml 中的 Application id 为自定义 AppApplication 类名
1
2
3
4
5
6
7
8
9

<application

android:name=".AppApplication"

...

/>

Parcelable 和 Serializable 使用场景选择

  1. Serializable : 作用是为了保存对象的属性到本地文件、数据库、网络流、rmi(Java remote method invocation:Java 远程方法调用)以方便数据传输,当然这种传输可以是程序内的也可以是俩个程序之间的。通常在需要进行 IO 操作时使用,如需要保存文件或者网络传输数据。

  2. Parcelable : 设计初衷是为了解决 Serializable 在序列化效率过慢的缺点,同时为了在程序内不同组件间以及不同 Android 程序间(AIDL)高效传输数据而设计,这些数据仅在内存中存在,Parcelable 是 IBinder 通信的消息载体。通常使用在内存之间数据传递使用。