MediaMetadataRetriever获取mp3文件信息
转发:http://blog.csdn.net/xiao5678yun/article/details/53838362
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
String str = getExternalStorageDirectory() + "1.mp3";
Log.d(TAG, "str:" + str);
try
{
mmr.setDataSource(str);
String title = mmr.extractMetad
2018-01-05
Android
通过Annotation为按钮设置监听(ButterKnife的原理)
通过注解来为按钮设置监听,类似于黄油匕首(butterknife)。
###步骤:
①
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
//注意这里两个元注解,RUNTIME保证运行时,保证可以被反射,FIELD表示目标是成员变量
public @interface ListenerFor {
Class<?extends ActionListener> listener();
}②
public class ActionListenerInstaller {
public static
2017-12-28
Java
通过反射查看泛型信息
#####通过泛型和反射避免强制类型转换:下面这个代码是没问题的。
Class clazz=Class.forName("java.util.Date");
Date date= (Date) clazz.newInstance();但是这样也没问题,编译器不会报错,但是run肯定会报错。
String string= (String) clazz.newInstance();结合泛型反射可以避免强制类型转换,让编译器帮我们检查:
@SuppressWarnings(value = "unchecked")
public class MainTest {
2017-12-27
Java
Proxy和Invocation动态代理和AOP代理
Proxy创建动态代理的两个方法:
//方法一
static Class<?> getProxyClass(ClassLoader loader, Class<?>...interfaces);
//方法二
static Object newProxyInstance(ClassLoader loader, Class<?> interfaces, InvocationHander hander);方法一:创建一个动态代理类所对应的Class对象,该代理类将实现interfaces数组所指定的多个接口。第一个ClassLoader参数指定生成动态代理类的类加
2017-12-27
Java
泛型类型转换的问题
String[] strings = new String[5];
Object[] objects=strings;
String a=new String();
Object obj=a;这两段代码说明的是:如果A是B的子类,那么A可以直接转换成B类型,A类数组也可以直接转换成B类数组。
List<String> list=new ArrayList<>();
List<Object> objectList=list;但是这段代码是错误的,不同的泛型对象,就算A是B的子类,A泛型的类也不能转换成B泛型的相同的类。编译器在编译阶段就可以报错:
总结:如果
2017-12-23
Java
volatile关键字
弄懂volatile之前首先确保弄懂了java内存模型,可参考我的整理Java内存模型
volatile的作用如下:
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
禁止进行指令重排序。(涉及volatile变量的代码的前面和后面的代码不会进行重排序)。
注意:
volatile不保证被修饰的变量的操作的原子性(要保证操作的原子性建议使用同步:synchronized和Lock)。
使用场景:
标记状态量:volatile boolean flag = false;
while(!flag){ doSomethi
2017-12-13
java并发
Java内存模型
参考:海子的博客Java并发编程:volatile关键字解析
三个重点:
原子性
可见性
有序性
讨论这三点之前先说一下计算机的内存模型:
CPU对程序的指令的执行速度远远大于从内存中读写数据的速度所以如果让CPU直接访问内存来读数据再写结果去内存,就会效率非常低下。因此就有了高速缓存——Cache这个东西。
举个例子看看他们怎么工作的:i=0;单线程运行代码:i=i+1;步骤是:Cache从主存读取i=0, CPU从Cache读取i,CPU运算i=i+1, 将结果i=1写入Cache,Cache再将结果i=1写入主存。
单线程没问题,但是多线程中*,比如开启两个线程分别执行i=i+
2017-12-13
java并发