手机网页视频抓取(android多线程线程处理防重复加载方法的优化方法)
优采云 发布时间: 2021-12-13 20:22手机网页视频抓取(android多线程线程处理防重复加载方法的优化方法)
奋斗过后,我们可能不会成功,但我们绝不会后悔。
手机视频数据获取子线程处理防重复加载方法优化
获取手机数据
在手机内部,任何功能都是由程序处理的。在使用手机多媒体内容时,手机中存储的一切,手机中都有一个媒体扫描器,它会扫描手机内部的数据,生成相应的数据库。
在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:创建处理程序
私有处理程序处理程序 = 新处理程序(){
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多线程有问题,我之前写过一篇关于线程的博客,你可以看看,希望对你有帮助。
安卓多线程编程
重新加载
/**
比如说我们有个方法只执行一次,但是在多个事件中都有调用
所以我们要做一个判断,来进行防重复调用,加载
方法很简单,但是我很受用,以前我的思路都是在调用的地方进行判断的赋值
而这中思路更加方便
*/
private boolean isLoad = false;
private void startActivity(){
if(!isload){
isLoad = true;
//做自己逻辑的处理
}
}
完毕。
卓越是一个持续的过程,而不是偶然的。
-来吧