ThreadPoolExecutor

Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable);
ExecutorService是一个接口,继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;
AbstractExecutorService是一个抽象类,实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;
ThreadPoolExecutor继承了类AbstractExecutorService。

在ThreadPoolExecutor类中有几个非常重要的方法:
execute()
execute()方法实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。
submit()
submit()方法是在ExecutorService中声明的方法,在AbstractExecutorService就已经有了具体的实现,在ThreadPoolExecutor中并没有对其进行重写,这个方法也是用来向线程池提交任务的,但是它和execute()方法不同,它能够返回任务执行的结果,去看submit()方法的实现,会发现它实际上还是调用的execute()方法,只不过它利用了Future来获取任务执行结果。
shutdown()
shutdownNow()
shutdown()和shutdownNow()是用来关闭线程池的。

Executors

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

百分比:0%  HEX: 00
百分比:1%  HEX: 30
百分比:2%  HEX: 50
百分比:3%  HEX: 80
百分比:4%  HEX: A0
百分比:5%  HEX: D0
百分比:6%  HEX: F0
百分比:7%  HEX: 12
百分比:8%  HEX: 14
百分比:9%  HEX: 17
百分比:10%  HEX: 1A
百分比:11%  HEX: 1C
百分比:12%  HEX: 1F
百分比:13%  HEX: 21
百分比:14%  HEX: 24
百分比:15%  HEX: 26
百分比:16%  HEX: 29
百分比:17%  HEX: 2B
百分比:18%  HEX: 2E
百分比:19%  HEX: 30
百分比:20%  HEX: 33
百分比:21%  HEX: 36
百分比:22%  HEX: 38
百分比:23%  HEX: 3B
百分比:24%  HEX: 3D
百分比:25%  HEX: 40
百分比:26%  HEX: 42
百分比:27%  HEX: 45
百分比:28%  HEX: 47
百分比:29%  HEX: 4A
百分比:30%  HEX: 4D
百分比:31%  HEX: 4F
百分比:32%  HEX: 52
百分比:33%  HEX: 54
百分比:34%  HEX: 57
百分比:35%  HEX: 59
百分比:36%  HEX: 5C
百分比:37%  HEX: 5E
百分比:38%  HEX: 61
百分比:39%  HEX: 63
百分比:40%  HEX: 66
百分比:41%  HEX: 69
百分比:42%  HEX: 6B
百分比:43%  HEX: 6E
百分比:44%  HEX: 70
百分比:45%  HEX: 73
百分比:46%  HEX: 75
百分比:47%  HEX: 78
百分比:48%  HEX: 7A
百分比:49%  HEX: 7D
百分比:50%  HEX: 80
百分比:51%  HEX: 82
百分比:52%  HEX: 85
百分比:53%  HEX: 87
百分比:54%  HEX: 8A
百分比:55%  HEX: 8C
百分比:56%  HEX: 8F
百分比:57%  HEX: 91
百分比:58%  HEX: 94
百分比:59%  HEX: 96
百分比:60%  HEX: 99
百分比:61%  HEX: 9C
百分比:62%  HEX: 9E
百分比:63%  HEX: A1
百分比:64%  HEX: A3
百分比:65%  HEX: A6
百分比:66%  HEX: A8
百分比:67%  HEX: AB
百分比:68%  HEX: AD
百分比:69%  HEX: B0
百分比:70%  HEX: B3
百分比:71%  HEX: B5
百分比:72%  HEX: B8
百分比:73%  HEX: BA
百分比:74%  HEX: BD
百分比:75%  HEX: BF
百分比:76%  HEX: C2
百分比:77%  HEX: C4
百分比:78%  HEX: C7
百分比:79%  HEX: C9
百分比:80%  HEX: CC
百分比:81%  HEX: CF
百分比:82%  HEX: D1
百分比:83%  HEX: D4
百分比:84%  HEX: D6
百分比:85%  HEX: D9
百分比:86%  HEX: DB
百分比:87%  HEX: DE
百分比:88%  HEX: E0
百分比:89%  HEX: E3
百分比:90%  HEX: E6
百分比:91%  HEX: E8
百分比:92%  HEX: EB
百分比:93%  HEX: ED
百分比:94%  HEX: F0
百分比:95%  HEX: F2
百分比:96%  HEX: F5
百分比:97%  HEX: F7
百分比:98%  HEX: FA
百分比:99%  HEX: FC
百分比:100%  HEX: FF

格式如#00FFFFFF,前两位代表不透明度的十六进制。00表示完全透明,FF就是全不透明。依次递增。

PackageName,所有的Android应用程序都有一个包名。包名是设备上的这个应用程序的唯一标识,所以应用共存从包名下手。

1.修改AndroidManifest中package

1
2
3
4
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.my.app"
android:versionCode="1"
android:versionName="1.0" >

大量的包、R.java的重命名,不推荐。

2. 配置应用的build.gradle文件

1
2
3
4
5
6
7
8
9
10
11
12
13
android{
...
buildTypes{
debug{
//在编译打包时会给包名加上后缀
applicationIdSuffix'.debug'
}
release{

}
}
...
}
阅读全文 »

实现parcelable接口的可序列化对象与byte[]相互转换,从而实现保存对象到文件或数据库。

parcelable to bytes

1
2
3
4
Parcel parcel = Parcel.obtain();
recorderConfiguration.writeToParcel(parcel, 0);
byte[] bundleBytes = parcel.marshall();
parcel.recycle();

bytes to parcelable

1
2
3
4
5
6
byte[] configBytes ;
Parcel parcel = Parcel.obtain();
parcel.unmarshall(configBytes, 0, configBytes.length);
parcel.setDataPosition(0);
request.recorderConfiguration = new RecorderConfiguration(parcel);
parcel.recycle();

同时播放多个视频时,播放完上一个视频切换到下一个视频,需要MediaPlayer先释放上一个视频,然后加载下一个视频,这时候难免会有一会卡顿出现;我解决方案是:通过MediaPlayer渲染到SurfaceView去播放视频,使用2个MediaPlayer,当第一个视频准备好时,去预加载下一个视频,减少MediaPlayer释放和加载视频消耗的时间。

阅读全文 »

一、Property Animation
创建一个动画通过修改对象属性在一段时间。
二、View Animation
包含2种类型:
Tween animation(补间动画):
创建一个动画通过执行一系列变化在一个图像上。
Frame animation(帧动画):
创建一个动画通过顺序播放一系列图片。

阅读全文 »

ViewPager

Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows.

阅读全文 »

view 高度伸展和收缩动画

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public static void expand(final View v) {
v.measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
final int targetHeight = v.getMeasuredHeight();

// Older versions of android (pre API 21) cancel animations for views with a height of 0.
v.getLayoutParams().height = 1;
v.setVisibility(View.VISIBLE);
Animation a = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
v.getLayoutParams().height = interpolatedTime == 1
? LayoutParams.WRAP_CONTENT
: (int)(targetHeight * interpolatedTime);
v.requestLayout();
}

@Override
public boolean willChangeBounds() {
return true;
}
};

// 1dp/ms
a.setDuration((int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}

public static void collapse(final View v) {
final int initialHeight = v.getMeasuredHeight();

Animation a = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}else{
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}

@Override
public boolean willChangeBounds() {
return true;
}
};

// 1dp/ms
a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}

最近发现,重写了viewGroup的onMeasure方法,造成子view match_parent不起作用,代码如下:

1
2
3
4
5
6
7
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = (int) (width / 0.75f);
super.onMeasure(width, height);
setMeasuredDimension(width, height);
}

阅读全文 »

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<!-- 圆角 -->
<corners
android:radius="9dp"
android:topLeftRadius="2dp"
android:topRightRadius="2dp"
android:bottomLeftRadius="2dp"
android:bottomRightRadius="2dp"/>


<!-- 渐变 -->
<gradient
android:startColor="@android:color/white"
android:centerColor="@android:color/black"
android:endColor="@android:color/black"
android:useLevel="true"
android:angle="45"
android:type="radial"
android:centerX="0"
android:centerY="0"
android:gradientRadius="90"/>


<!-- 间隔 -->
<padding
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp"/><!-- 各方向的间隔 -->


<!-- 大小 -->
<size
android:width="50dp"
android:height="50dp"/><!-- 宽度和高度 -->


<!-- 填充 -->
<solid
android:color="@android:color/white"/><!-- 填充的颜色 -->


<!-- 描边 -->
<stroke
android:width="2dp"
android:color="@android:color/black"
android:dashWidth="1dp"
android:dashGap="2dp"/>


</shape>

X,Y轴放大,透明度减少

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private AnimationSet initAnimationSet() {
AnimationSet animSet = new AnimationSet(true);
ScaleAnimation scaleAnim = new ScaleAnimation(1f, 1.2f, 1f, 1.2f,
ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
scaleAnim.setDuration(DURATION_ANIMATOR);
scaleAnim.setRepeatCount(Animation.INFINITE);// 设置循环
AlphaAnimation alphaAnim = new AlphaAnimation(1f, 0f);
alphaAnim.setDuration(DURATION_ANIMATOR);
alphaAnim.setRepeatCount(Animation.INFINITE);//设置循环
animSet.addAnimation(scaleAnim);
animSet.addAnimation(alphaAnim);
return animSet;
}

今天遇到一个奇怪现象,startActivity没反应,没有任何log,突然想到重写了activity的startActivityForResult方式,而且还把super删了,

纪念傻傻的我。。。。。。。

1
2
3
4
@Override
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
super.startActivityForResult(intent, requestCode, options);
}

个人觉得RecycleView很强大,很好的扩展性,稳定,将会逐渐代替gridview和listview。

GridLayoutManager

实现gridview功能。

使用GridLayoutManager给RecycleView加headview或footview,总共有3列,spansize表示表示该子view占几个位置。

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
protected RecyclerView.LayoutManager getLayoutManager() {
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {

int spanSize;
switch (adapter.getItemViewType(position)) {
case ShowThumbnailData.LIVE:
case ShowThumbnailData.PHOTO:
case ShowThumbnailData.PLAYBACK:
spanSize = 1;
break;
case ShowThumbnailData.HEADER:
spanSize = 3;
break;
case ShowThumbnailData.LIVEV2:
spanSize = 3;
default:
spanSize = 1;
break;
}
return spanSize;
}
});
return gridLayoutManager;
}

StaggeredGridLayoutManager