Android
1. AsyncTask
超简述原理
AsyncTask
本质是一个静态的线程池(容量 128,执行数 5),AsyncTask
派生出来的子类可以实现不同的异步任务,这些任务都是提交到静态线程池中执行的;
- 线程池中的工作线程
mWorker
执行doInBackground(mParams)
方法执行异步任务;
- 当任务状态(执行成功、取消执行、进度更新)后,工作线程会向 UI 线程发送消息,
AsyncTask
内部的InternalHandler
响应这些消息,并调用相关的回调函数;
- 不足处:线程池大小固定,如果添加线程数量超过固定值,则会抛出拒绝新线程的
RejectedExcutionException
。解决方式为新开一个线程,时刻关注线程池内线程数量,如果线程池线程满了,那么则休眠新线程,否则将线程添加到线程池中。
- 3.0 之前线程池是并行执行,3.0 之后通过
SerialExcutor
执行串行操作。真正的操作是在THREAD_POOL_EXCUTOR
线程。如果想要强行并行执行,可以直接使用excuteOnExcutor
方法即可;
2. 突破 65536 方法数限制超简述方式:分包(dex)方式
- 配置 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
}
dexOptions {
javaMaxHeapSize '4g'
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
|
- 自定义
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);
}
}
|
- 设置 AndroidManifest.xml 中的 Application id 为自定义 AppApplication 类名
1 2 3 4 5 6 7 8 9
| <application
android:name=".AppApplication"
...
/>
|
Parcelable 和 Serializable 使用场景选择
Serializable : 作用是为了保存对象的属性到本地文件、数据库、网络流、rmi(Java remote method invocation:Java 远程方法调用)以方便数据传输,当然这种传输可以是程序内的也可以是俩个程序之间的。通常在需要进行 IO 操作时使用,如需要保存文件或者网络传输数据。
Parcelable : 设计初衷是为了解决 Serializable 在序列化效率过慢的缺点,同时为了在程序内不同组件间以及不同 Android 程序间(AIDL)高效传输数据而设计,这些数据仅在内存中存在,Parcelable 是 IBinder 通信的消息载体。通常使用在内存之间数据传递使用。