手机网页视频抓取(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;

//做自己逻辑的处理

}

}

  完毕。

  卓越是一个持续的过程,而不是偶然的。

  -来吧

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线