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

来源:互联网 发布:淘宝商品如何上架 编辑:程序博客网 时间:2024/05/01 05:40

有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 0
原创粉丝点击