转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6606720.html

假设我们在做项目的时候,获取到了一段音频,也知道音频长度,那么我们想对音频做一些处理的时候,在这个处理动作之前往往要做时间循环判断

已知:音频长度,并且还给出下面四个条件
重试时间长度 = 音频长度 × 0.7 + 30秒
第一次重试: 重试时间长度 x 0.15
第二次重试: 重试时间长度 x 0.5
第三次重试: 重试时间长度 x 1

上述的已知条件我们可以用下面这两段代码来实现:

private int[] getRetryIntervalTimes(final Context context, final int duration) {
// 重试时间长度 = 音频长度 × 0.7 + 30秒
final int retryMaxTime = duration * getResValue(context, 70) / 100 + getResValue(context, 30);
// 第一次重试: 重试时间长度 x 0.15
// 第二次重试: 重试时间长度 x 0.5
// 第三次重试: 重试时间长度 x 1
return new int[]{
0,
(retryMaxTime * getResValue(context, 15) / 100) * 1000,
(retryMaxTime * getResValue(context, 50) / 100) * 1000,
(retryMaxTime * getResValue(context, 100)/ 100) * 1000
};
}
private int getResValue(final Context context, final int resId) {
return Integer.parseInt(context.getString(resId));
}

执行循环判断,一般都是Retry3次,如果不通过就不执行处理,三次以内,那次执行通过,那次就开始做处理。可以用下面这段代码来实现:

private void initMethod() {
final int[] retryIntervalTimeMillis = getRetryIntervalTimes(getApplicationContext(), 整型音频长度);
final long[] executeTimes = {0, 0, 0, 0};
long startTimeMillis = 0;
// 重试三次
for (int i = 0; i < 4; i++) {
try {
if (i > 0) {
long waitTimeMillis = executeTimes[i] - System.currentTimeMillis();
Date executeTime = new Date(executeTimes[i]);
String planTime = String.format(Locale.CHINESE, "%tF|%tT.%tL", executeTime, executeTime, executeTime);
Log.d("", "<" + i + "> Plan: " + planTime + ", Wait: " + (waitTimeMillis > 0 ? waitTimeMillis : 0) + "ms");
if (waitTimeMillis > 0) {
Thread.sleep(waitTimeMillis);
}
}
startTimeMillis = System.currentTimeMillis();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (i == 0) {
// 重试时间起点 = 首次完成时间确认
final long retryStartTimeMillis = System.currentTimeMillis();
// 重试计划开始时间 = 重试时间起点 + 重试各次间隔时间
executeTimes[1] = retryStartTimeMillis + retryIntervalTimeMillis[1];
executeTimes[2] = retryStartTimeMillis + retryIntervalTimeMillis[2];
executeTimes[3] = retryStartTimeMillis + retryIntervalTimeMillis[3];
}
Log.d("", "<" + i + "> [FINISH]. process time: " + (System.currentTimeMillis() - startTimeMillis) + "ms");
}
}
}

以上就是Java时间间隔问题在Android中的使用。

关注我的新浪微博,获取更多Android开发资讯!

关注科技评论家,领略科技、创新、教育以及最大化人类智慧与想象力!

Java时间间隔问题在Android中的使用的更多相关文章

  1. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  2. Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug

    由于android获取图片过大是会出现内存溢出的Bug 07-02 05:10:13.792: E/AndroidRuntime(6016): java.lang.OutOfMemoryError 解 ...

  3. Java乔晓松-android中上传图片到服务器Tomcat(Struts2)

    在做android开发的时候,有时你会用到图片的上传功能,在我的android项目中,我是选中图片,点击上传多张图片 android客户端上传图片部分的代码如下: package com.exampl ...

  4. Java反射及其在Android中的应用学习总结

    一. Java反射机制 Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制同意程序在执行时透过Reflection APIs取得不论什么一个已知名称的class的内部信 ...

  5. Java乔晓松-android中的帧动画FrameByFrame

    先看效果后上代码: 动画开始---- 动画切换的界面---- 动画播放完毕后的跳转界面----- 重要的方法: imageView.setBackgroundResource(R.anim.frame ...

  6. 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

    原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...

  7. Android中使用GridView和ImageViewSwitcher实现电子相册简单功能

    我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片.如下图的显示效果: 首先我们先罗列一下本次实现所 ...

  8. 在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错

    在android中下载文件,写好下载文件的代码后需要配置相应的权限 <uses-permission android:name="android.permission.INTERNET ...

  9. 在Android中使用Java 8的lambda表达式

    作为一名Java开发者,或许你时常因为缺乏闭包而产生许多的困扰.幸运的是:Java's 8th version introduced lambda functions给我们带来了好消息;然而,这咩有什 ...

随机推荐

  1. 如何定制Gtk版Emacs的Widget外观

    当我们使用 xlib 版的Emacs时,可以通过 XResource 定义 Emacs 的菜单 栏.工具条.滚动条的外观. 现在,在Linux上我们大多使用 gtk版的Emacs,是否还有办法定义 E ...

  2. Kissy && Require

    KISSY add(name?,factory?,deps)  函数挂载在全局对象KISSY上,用来定义模块.   一个 JS 文件包含一个add()(这时路径+文件名可以用作模块名),如果一个文件包 ...

  3. Java编程思想 4th 第3章 操作符

    有了数据,还需要进行数据间的运算,因此Java中也有数据间运算的各种符号,书本称之为操作符,正确的翻译应该是运算符. Java中的运算符同C++相同,运算符同运算符对象构成表达式,表达式是运算对象及运 ...

  4. aarch64_j1

    JSCookMenu-2.0.4-13.fc26.noarch.rpm 2017-02-14 07:06 37K fedora Mirroring Project Java-WebSocket-1.3 ...

  5. MySQL参数设置

    InnoDB配置 从MySQL 5.5版本开始,InnoDB就是默认的存储引擎并且它比任何其它存储引擎的使用要多得多.那也是为什么它需要小心配置的原因. 1 innodb_file_per_table ...

  6. IDL界面程序直接调用envi菜单对应功能

    参考自http://blog.sina.com.cn/s/blog_764b1e9d010115qu.html 参考文章的方法是构建一个button控件,通过单击实现,这种方法比较复杂,不是我们经常能 ...

  7. Python函数:对变量赋值,变量即局部

    b = 6 def f2(a): print(a) print(b) b = 9 UnboundLocalError: local variable 'b' referenced before ass ...

  8. dragstart drag dragend dragenter dragover dragleave drop

    dragstart drag dragend dragenter dragover dragleave drop   前端框架层出不穷,网页上的效果越来越绚丽,制作绚丽的效果的成本越来越低,其中有种拖 ...

  9. Ad Hoc Distributed Queries的启用与关闭

    启用Ad Hoc Distributed Queries: exec sp_configure 'show advanced options',1 reconfigure exec sp_config ...

  10. php中的单引号与双引号详解

    一.引号定义字符串 在Php中,通常一个字符串被定义在一对引号中,如: 'I am a string in single quotes'"I am a string in double qu ...