奋斗之后,我们不一定成功,但是绝对不会后悔。
- 获取手机视频数据
- 子线程处理
- 防重复加载方法的优化
获取手机数据
在手机内部,任何功能都是以程序处理的。在使用手机多媒体内容的时候,凡事存储在手机中的,在手机中有媒体扫描器,会扫描手机内部的数据,生成相应数据库。
在root下的手机,我们可以直接查看相应内容
data/data/com.android.providers.media/databases
截图:
通过内容提供者进行获取数据内容:
/**
获取手机中视频内容
关键代码
*/
private void getdata(){
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URL;
String[] projections = {
MediaStore.Video.Media.DISPLAY_NAME,//名称
MediaStore.Video.Media.DURATION,//时长
MediaStore.Video.Media.SIZE,//大小
MediaStore.Video.Media.DATA,//路径
};
/**
关于query()中的参数进行说明一下
Cursor cursor = getContentResolver().
query(@NonNull Uri uri, @Nullable String[] projection,
@Nullable String selection, @Nullable String[] selectionArgs,
@Nullable String sortOrder)
@params uri: 查询路径
@params projection: 需要查询的相关列
@params selection : 选择条件
@params selectionArgs:
@params sortOrder: 指定查询结果排列方式 /ASC/DESC
*/
Cursor cursor = getContentResolver().query(uri,projections,null,null,null);
/*
查询出来的结果会按照 projection 的要求进行存储。
*/
while(cursor.moveToNext()){
String name = cursor.getString(0);
long duration = cursor.getString(1);
long size = cursor.getString(2);
//对于size查询出来一bytes单位,但是在界面显示的时候,我们还是要使用 kb,M,Tb这些常人能够看懂的单位才可以。那么在android中有一个方法:Formatter.formatFilesSize(Context , long).本身为android方法,所以可以在android库中查看,不多说了
String data = cursor.getString(3);
/*
此时已经得到需要的信息,然后进行自己项目的处理方法。
比如加载到适配器进行显示。
1:创建相应的POJO
2:创建自己的适配器
3:进行调用
这里非重要代码,所以省略了···
*/
}
//完成工作后记得关闭相应的cursor
cursor.close();
}
问题:查询手机中的任何内容,属于耗时操作的范围。所以需要使用自从子线程进行处理。
子线程中处理耗时操作
1.优化getdata()方法:
/**
*/
private void getdata(){
new Thread(new Runable(){
@override
public void run(){
//加入上面getdata中的代码
···
}
}).start();
}
因为android中只有一个主线程,所以在子线程中无法操作UI界面
所以结合Handler来进行处理
2:创建Handler
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg){
//处理Ui变化操作
};
};
3:在getdata()方法中发送消息,交给handler处理Ui变化
在run()方法中添加如下代码即可
//处理UI界面变化
handler.sendEmptyMessage(0);
最后:完整的getdata()方法如下:
private void getdata(){
new Thread(new Runable(){
@override
public void run(){
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URL;
String[] projections = {
MediaStore.Video.Media.DISPLAY_NAME,//名称
MediaStore.Video.Media.DURATION,//时长
MediaStore.Video.Media.SIZE,//大小
MediaStore.Video.Media.DATA,//路径
};
Cursor cursor = getContentResolver().query(uri,projections,null,null,null);
while(cursor.moveToNext()){
String name = cursor.getString(0);
long duration = cursor.getString(1);
long size = cursor.getString(2);//查询出来一bytew
String data = cursor.getString(3);
}
cursor.close();
handler.sendEmptyMessage(0);
}
}).start();
}
如果说对于android多线程有问题的朋友,在下之前写过一篇关于线程的blog,可以查看,希望有所帮助。
放重复加载
/**
比如说我们有个方法只执行一次,但是在多个事件中都有调用
所以我们要做一个判断,来进行防重复调用,加载
方法很简单,但是我很受用,以前我的思路都是在调用的地方进行判断的赋值
而这中思路更加方便
*/
private boolean isLoad = false;
private void startActivity(){
if(!isload){
isLoad = true;
//做自己逻辑的处理
}
}
DONE。
Excellence is a continuous process and not accident.
—come on