安卓开发统计用户在线时长

有3种方案:
1、客户端定时发送请求到服务器端。实现方法是在用户登录后,将uid,session_id,login_time插入一条记录,然后在客户端js设定一个计时器,比如每10分钟向服务器端发送一个请求,以此来达到更新登出时间的目的,当然这个间隔时间设定的越短,数据可能会越准确,不过相应的系统的负载也会越高,这个可以根据实际情况设定一个合适的值。这种方法广泛应用于webgame上,因为webgame的几乎所有请求都是ajax请求,不用刷新页面,一旦刷新页面,这个计时器就失去了价值,这也是这个方法的局限性。

2、务器设定一个定时轮询的脚本。这个方法是在服务器端写一个定时执行的脚本,比如5分钟执行一次,根据数据库中的记录来判断每个会话的 session_id是否还存在于服务器上,如果存在就更新logout_time,不存在就跳过。这样也能比较准确的统计在线时间,不过缺点是需要有服务器的控制权,不然无法设定定时脚本,linux系统可以通过crontab实现,windows系统可以通过计划任务来完成。如果你只是买的虚拟主机,那么这个方法也同样不适合你。

3、在用户每次活动时更新一下登出时间。这样在用户不活动或者退出的时候,登出时间就自然而 然的存在于数据库里了。首先,在用户登录成功后,记录下其uid,session_id,并将现在时间作为登陆时间,现在时间 600s作为登出时间,插入数据库。

上面3种方案是针对PC端浏览器而言的,我们可以借鉴一下,采取第一种方案并加以改进:
每隔1分钟发一次请求,把(当前用户id、登录时间戳、目前在线时长)发送给服务器。服务器接收到请求,根据用户id去数据库对应的表里查,看该登录时间戳是否存在,如果不存在,则添加一条记录,如果存在,则更新在线时长。如果连续失败5次,那么就可以看做本次已经登出了,更新登录时间戳,失败次数归0,继续执行。

package com.vzone.tmdsdk.task;

import com.vzone.tmdsdk.model.net.API;
import com.vzone.tmdsdk.model.net.RequestParams;

/**
 * 提交登录时长发送给服务器
 */
public class TimeTask extends BaseTask implements Runnable {
    private long mStartTimeMillis;
    private String mUserId;
    private int mFailTimes;

    public TimeTask(long startTimeMillis, String userId) {
        this.mStartTimeMillis = startTimeMillis;
        this.mUserId = userId;
    }

    @Override
    public void run() {
        //System.out.println("time");
        if (UserCondition.isOnForeground && NetworkTool.isNetworkConnected()) {
            RequestParams requestParams = new RequestParams();
            requestParams.addRequestParam("uid", UserCondition.ACCOUNT_ID);
            requestParams.addRequestParam("appid", UserCondition.APPID);
            requestParams.addRequestParam("imei", UserCondition.IMEI);
            requestParams.addRequestParam("app_version", UserCondition.APP_VERSION);
            requestParams.addRequestParam("login_time", mStartTimeMillis / 1000);
            // 持续时间(秒)
            requestParams.addRequestParam("duration", (System.currentTimeMillis() - mStartTimeMillis) / 1000);
            // 判断结果
            String result = submitPostRequest(API.URL_ONLINE_TIME, requestParams);

            JSONObject jsonObject = JsonTool.getJsonObject(result);
            boolean operateSuc = ResponseTool.dealResponse(jsonObject, "online", "在线时间更新");
            if (!operateSuc) {
                mFailTimes++;
            } else {
                mFailTimes = 0;
            }

            if (mFailTimes > 5) {
                // 连续5次发送失败,那么就断定该用户已经登出了,更新登录时间,失败次数归0
                mStartTimeMillis = System.currentTimeMillis();
                mFailTimes = 0;
            }
        } else {
            mStartTimeMillis = System.currentTimeMillis(); 
            mFailTimes = 0;
        }
    }
}

注意:直接传用户id是不安全的,建议和服务器端配合好,采用token或加密。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值