简体   繁体   English

使用户在线/离线状态

[英]Get User online/offline state

I have chat app where i need to develop user online state and for this i am calling API in every 15 seconds on server, which will return all logged in users and their online state in 0(Offline) and 1(Online). 我有一个聊天应用程序,我需要在其中开发用户在线状态,为此,我每15秒钟在服务器上调用一次API,它将返回所有已登录的用户及其在线状态(分别为0(离线)和1(在线))。

I need to show whether user is online or offline (leaves app not logged out) while chatting.I have 1 array list which shows when app is launch with all logged in user id and their details including their online state and i created second API which return users online state in JSON.I have following option to achieve users online state 我需要在聊天时显示用户是在线还是离线(叶子应用程序未注销)。我有1个数组列表,其中显示了应用程序启动时的所有登录用户ID及其详细信息(包括其在线状态),并创建了第二个API以JSON返回用户在线状态。我有以下选择来实现用户在线状态

  • Replace existing array list item:-I am getting User ID and their online state in JSON but i need to run loop in every 15 second which replace values in existing arraylist 替换现有数组列表项:-我正在JSON中获取用户ID及其在线状态,但我需要每隔15秒运行一次循环,以替换现有数组列表中的值
  • Store JSON in someway where i can easily find user id and its state:- If i store JSON in array list i need to run loop to find ID and its state which i dont want to,So which is best way to store JSON so i can easily get user state by its User ID. 将JSON存储在某种方式下,我可以轻松找到用户ID及其状态:-如果我将JSON存储在数组列表中,则需要运行循环以查找我不想要的ID及其状态,因此这是存储JSON的最佳方法,所以我可以通过其用户ID轻松获取用户状态。

Here is how i am getting JSON 这是我如何获取JSON

protected List<WrapperClass> doInBackground(Void... params) {
        userSession=new UserSession(context,"Elaxer");
        UserState_Update=new ArrayList<>();


            String data = null;
            try {
                String ID=userSession.getUserID(); //Getting Value from shared pref
                data = URLEncoder.encode("User_ID", "UTF-8") + "=" + URLEncoder.encode(ID, "UTF-8");
                Log.d(TAG,"Login ID "+ ID);
                Log.d(TAG,"DO IN BACKGROUND START ");
                URL url=new URL(URL_Path_NearBy);
                connection= (HttpURLConnection) url.openConnection();
                Log.d(TAG,connection.toString());
                connection.setRequestMethod("POST");
                connection.setDoInput(true);
                connection.setDoOutput(true);

                //For POST Only - Begin
                OutputStream os = connection.getOutputStream();
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
                writer.write(data);
                writer.flush();
                writer.close();
                os.close();
                connection.connect();

                InputStream inputStream=connection.getInputStream();
                reader=new BufferedReader(new InputStreamReader(inputStream));
                Log.d(TAG,"GET INPUT STREAM AND PUUTING INTO READER");
                String line;
                StringBuffer stringBuffer=new StringBuffer();
                while ((line=reader.readLine())!=null){
                    stringBuffer.append(line);

                }
                String completeJSON=stringBuffer.toString();
                Log.d(TAG,"JSON ARRAY START");

                JSONObject parentArray=new JSONObject(completeJSON);
                JSONArray jsonArray=parentArray.getJSONArray("uData");


                String LastSeen;
                int LoginStatus,User_ID;
                int Rec_Online_Status;

                for (int i = 0; i <jsonArray.length() ; i++) {
                    JSONObject childObject=jsonArray.getJSONObject(i);

                    LastSeen=childObject.getString("lastseen") ;
                    LoginStatus=childObject.getInt("login_status") ;
                    User_ID=childObject.getInt("User_ID");
                    String UseID= String.valueOf(User_ID);
                    Log.d(TAG,"JSON Values "+LastSeen+" "+LoginStatus+" "+User_ID);

                    WrapperClass wrapperClass=new WrapperClass(UseID,LoginStatus);
                    UserState_Update.add(wrapperClass);
                }

                return UserState_Update; //List<WrapperClass> UserState_Update

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }




        return null;
    }

This is the response as JSON 这是作为JSON的响应

{
    "status": "SUCCESS",
    "uData": [
        {
            "User_ID": "4",
            "login_status": "1",
            "lastseen": "0000-00-00 00:00:00"
        },
        {
            "User_ID": "1",
            "login_status": "0",
            "lastseen": "0000-00-00 00:00:00"
        },
        {
            "User_ID": "12",
            "login_status": "1",
            "lastseen": "0000-00-00 00:00:00"
        },
        {
            "User_ID": "33",
            "login_status": "0",
            "lastseen": "0000-00-00 00:00:00"
        }
    ]
}

Is this right way to get user online state? 这是使用户处于在线状态的正确方法吗? (I know FCM is right way but FCM currently not ready on app server side) (我知道FCM是正确的方法,但FCM目前尚未在应用服务器端准备就绪)

UPDATE 2 :-As code recommended by @XngPro i implement on doinBackground 更新2 :-由@XngPro推荐的代码我在doinBackgrounddoinBackground

Map<String,Online_Status_Wrapper.User> map=new HashMap<>();
    Online_Status_Wrapper wrapper=gson.fromJson(completeJSON,Online_Status_Wrapper.class);
                        Log.d(TAG,"Wrapper Get Data value "+wrapper.getuData());
                        Log.d(TAG,"Wrapper Get Status value "+wrapper.getStatus());

                        for (Online_Status_Wrapper.User u: wrapper.getuData()){
                            map.put(u.getUser_ID(),u);
                        }


                        Log.d(TAG,"State of Other User users "+map.get(12).getLogin_status());//HERE I AM GETTING NullPointerException
                        return map;

I think you should use a Java serialization/deserialization library like Gson . 我认为您应该使用像Gson这样的Java序列化/反序列化库。

Hope to help you~ 希望对你有帮助〜

Example

private static void bar() {
    String jsonStr = "{\"status\":\"SUCCESS\",\"uData\":[{\"User_ID\":\"4\",\"login_status\":\"1\",\"lastseen\":\"0000-00-00 00:00:00\"},{\"User_ID\":\"1\",\"login_status\":\"0\",\"lastseen\":\"0000-00-00 00:00:00\"},{\"User_ID\":\"12\",\"login_status\":\"1\",\"lastseen\":\"0000-00-00 00:00:00\"},{\"User_ID\":\"33\",\"login_status\":\"0\",\"lastseen\":\"0000-00-00 00:00:00\"}]}";
    Gson gson = new Gson();
    UserFoo userFoo = gson.fromJson(jsonStr, UserFoo.class);
    Map<String, UserFoo.User> map = new HashMap<>();
    for (UserFoo.User u : userFoo.getUData()) {
        map.put(u.getUser_ID(), u);
    }
    System.out.println("userId: 12, loginState: " + map.get("12").getLogin_status());
}

public static class UserFoo {

    /**
     * status : SUCCESS
     * uData : [{"User_ID":"4","login_status":"1","lastseen":"0000-00-00 00:00:00"},{"User_ID":"1","login_status":"0","lastseen":"0000-00-00 00:00:00"},{"User_ID":"12","login_status":"1","lastseen":"0000-00-00 00:00:00"},{"User_ID":"33","login_status":"0","lastseen":"0000-00-00 00:00:00"}]
     */

    private String status;
    private List<User> uData;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public List<User> getUData() {
        return uData;
    }

    public void setUData(List<User> uData) {
        this.uData = uData;
    }

    public static class User {
        /**
         * User_ID : 4
         * login_status : 1
         * lastseen : 0000-00-00 00:00:00
         */

        private String User_ID;
        private String login_status;
        private String lastseen;

        public String getUser_ID() {
            return User_ID;
        }

        public void setUser_ID(String User_ID) {
            this.User_ID = User_ID;
        }

        public String getLogin_status() {
            return login_status;
        }

        public void setLogin_status(String login_status) {
            this.login_status = login_status;
        }

        public String getLastseen() {
            return lastseen;
        }

        public void setLastseen(String lastseen) {
            this.lastseen = lastseen;
        }
    }
}
public class Test {

    public static void main(String[] args) {
        bar();
    }

    private static void bar() {
        String jsonStr = "{\"status\":\"SUCCESS\",\"uData\":[{\"User_ID\":\"4\",\"login_status\":\"1\",\"lastseen\":\"0000-00-00 00:00:00\"},{\"User_ID\":\"1\",\"login_status\":\"0\",\"lastseen\":\"0000-00-00 00:00:00\"},{\"User_ID\":\"12\",\"login_status\":\"1\",\"lastseen\":\"0000-00-00 00:00:00\"},{\"User_ID\":\"33\",\"login_status\":\"0\",\"lastseen\":\"0000-00-00 00:00:00\"}]}";
        Gson gson = new Gson();
        UserFoo userFoo = gson.fromJson(jsonStr, UserFoo.class);
        Map<String, UserFoo.User> map = new HashMap<>();
        for (UserFoo.User u : userFoo.getUData()) {
            map.put(u.getUser_ID(), u);
        }
        System.out.println("userId: " + "12, loginState: " + map.get("12").getLogin_status());
    }

    public static class UserFoo {

        /**
         * status : SUCCESS
         * uData : [{"User_ID":"4","login_status":"1","lastseen":"0000-00-00 00:00:00"},{"User_ID":"1","login_status":"0","lastseen":"0000-00-00 00:00:00"},{"User_ID":"12","login_status":"1","lastseen":"0000-00-00 00:00:00"},{"User_ID":"33","login_status":"0","lastseen":"0000-00-00 00:00:00"}]
         */

        private String status;
        private List<User> uData;

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public List<User> getUData() {
            return uData;
        }

        public void setUData(List<User> uData) {
            this.uData = uData;
        }

        public static class User {
            /**
             * User_ID : 4
             * login_status : 1
             * lastseen : 0000-00-00 00:00:00
             */

            private String User_ID;
            private String login_status;
            private String lastseen;

            public String getUser_ID() {
                return User_ID;
            }

            public void setUser_ID(String User_ID) {
                this.User_ID = User_ID;
            }

            public String getLogin_status() {
                return login_status;
            }

            public void setLogin_status(String login_status) {
                this.login_status = login_status;
            }

            public String getLastseen() {
                return lastseen;
            }

            public void setLastseen(String lastseen) {
                this.lastseen = lastseen;
            }
        }
    }

}  

Print 打印
在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我如何通过XMPP aSmack获取所有用户状态信息(离线/在线/离开/等) - How I get the all user state infromation(offline/online/away/etc.) by XMPP aSmack 没有使用Firebase的互联网连接时如何获取对手用户的在线/离线状态 - How to get online/offline state of the opponent user when there is no internet connection using firebase Android:如何在quickblox中获取在线或离线用户状态? - Android: How to get online or offline user status in quickblox? XMPP aSmack-如何监听自己的用户状态(在线/离线)以重新连接 - XMPP aSmack - How can I listen on my own user state (Online/Offline) to Reconnect 当 kafka 生产者在线或离线时获取通知 - get notifications when kafka producer is online or offline 如何在java websocket上线后发送离线用户的消息? - How to send messages of offline user after getting online in java websocket? 在线/离线用户功能 firestore 或实时有什么更好的解决方案? - What is better solution for online/offline user feature firestore or realtime? 在应用程序中处理离线和在线用户的最佳方法是什么? - What the best approach to handle offline and online user in app? 如何通过具有脱机状态的Java获取MAC地址 - How to get MAC address by java with offline state 离线和在线地理编码服务 - Geocoding services offline and online
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM