相当于C中的函数指针,或者Java中的引用。
对比有什么不同,Groovy中,入参只有一个并且是个闭包时,可省略圆角括号;入参最后一个参数为闭包时,该闭包可以单独用花括号包裹并放在圆括号外面。这是语法上的不同。
创建task的过程
1 Task task(Map<String, ?>args, String name, Closure configureClosure)创建指定类型的Task,也就是org.gradle.api.tasks.Delete
2 调用configureClosure闭包,简启执行delete函数,入参是rootProject.buildDir。到此cleantask实例创建、初始化成功。
3 执行./gradlew clean。执行clean的action。比如被@TaskAction标注的函数。
练习,猜一下下面日志的输出顺序
修改build.gradle 后点击sync now刷新,以下为输出log顺序
层级关系是这样的gradle -- rootProject -- subProject -- task -- action
生成的taskGraph长什么样子呢?调用./gradlew assembleDebug 后发生了什么
思路:分三步
找到Apk依赖的所有的Jar包 和 Class文件 -----》 解压Jar解析Class内容 ----》 输出文件名。
Class文件格式
转化为Dex之前,可插入Task,输入为当前apk依赖的所有jar和class。自定义一个Transform 或者在 app:compileDebugJavaWithJavac 后面
涉及概念点extension、task、plugin入口、maven管理
把每种技能比喻为一把刀,平拦凯如时我们用的是菜刀,现在一块大骨头面前想吃牛骨髓,孙慎怎么办?不知道大家喜不喜欢吃?就需要一把砍刀。工作中你有多少把刀?
多了一把刀,多了一种解决问题的方式和思路,比如我们用的三方源码库实现方式的过程从 APO -> APT ->Gradle,不断迁移,也更强大,也是赋能量、更自由的过程。
android系统启动时会去扫描系统文件,并将系统支谈碰持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件腊困的信息:public static List<VideoInfo>sysVideoList = null// 视频信息集合
sysVideoList = new ArrayList<VideoInfo>()
setVideoList()
private void setVideoList() {
// MediaStore.Video.Thumbnails.DATA:视频缩略图的文件路径
String[] thumbColumns = { MediaStore.Video.Thumbnails.DATA,
MediaStore.Video.Thumbnails.VIDEO_ID }
// MediaStore.Video.Media.DATA:视频文件轮侍念路径;
// MediaStore.Video.Media.DISPLAY_NAME : 视频文件名,如 testVideo.mp4
// MediaStore.Video.Media.TITLE: 视频标题 : testVideo
String[] mediaColumns = { MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.MIME_TYPE,
MediaStore.Video.Media.DISPLAY_NAME }
cursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
mediaColumns, null, null, null)
if(cursor==null){
Toast.makeText(SystemVideoChooseActivity.this, "没有找到可播放视频文件", 1).show()
return
}
if (cursor.moveToFirst()) {
do {
VideoInfo info = new VideoInfo()
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.Video.Media._ID))
Cursor thumbCursor = managedQuery(
MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,
thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID
+ "=" + id, null, null)
if (thumbCursor.moveToFirst()) {
info.setThumbPath(thumbCursor.getString(thumbCursor
.getColumnIndex(MediaStore.Video.Thumbnails.DATA)))
}
info.setPath(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)))
info.setTitle(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)))
info.setDisplayName(cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)))
LogUtil.log(TAG, "DisplayName:"+info.getDisplayName())
info.setMimeType(cursor
.getString(cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE)))
sysVideoList.add(info)
} while (cursor.moveToNext())
}
}
有一点需要注意的是:系统的媒体库并不会在我们添加视频文件后自动更新,我们如何去手动扫描媒体库,或者重启系统才能从媒体库中得到更新的视频文件:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ Environment.getExternalStorageDirectory())))
这个想法优点笨拙,android通过sqlite保存了所有的音频文件,所以枝此可以通过发送广播来实现扫描音频文件,但是他不会显示进度。所以如果扫描猛冲迅SD卡的话感觉应该根据根目录的文件夹个数来估算下进度,到时候针对专门判指的文件夹来扫描。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)