zoukankan      html  css  js  c++  java
  • Java时间间隔问题在Android中的使用

    转载请注明出处: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开发资讯!

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

  • 相关阅读:
    初学Python3
    性能测试学习成长图
    k8s集群部署mysql(docker自创建镜像)
    docker 部署uwgsi+python 启动报错 Python 3 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
    jenkins 打安卓包 cpu使用过高处理操作
    docker部署mysql,nginx,php,并上传镜像到私有仓库
    Linux下PHP7.2扩展
    docker部署Eurake服务,服务节点无法注册服务
    本地Pycharm将spark程序发送到远端spark集群进行处理
    spark集群安装并集成到hadoop集群
  • 原文地址:https://www.cnblogs.com/cnwutianhao/p/6606720.html
Copyright © 2011-2022 走看看