获取用户在线/离线状态

时间:2017-03-28 15:28:10

标签: java android arrays json

我有聊天应用程序,我需要开发用户在线状态,为此我在服务器上每15秒调用一次API,这将返回所有登录用户及其在线状态0(离线)和1(在线) 。

我需要在聊天时显示用户是在线还是离线(离开应用程序未注销)。我有1个数组列表,显示应用程序启动时所有登录的用户ID及其详细信息,包括他们的在线状态和我创建的在JSON中返回用户在线状态的第二个API。我有以下选项来实现用户在线状态

  • 替换现有的数组列表项: - 我在JSON中获取用户ID及其在线状态,但我需要每15秒运行一次循环,以替换现有arraylist中的值
  • 在某些地方存储JSON我可以轻松找到用户ID及其状态: - 如果我将JSON存储在数组列表中,我需要运行循环来查找我不想要的ID及其状态,那么这是存储的最佳方式JSON所以我可以通过其用户ID轻松获取用户状态。

以下是我如何获得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;
    }

这是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"
        }
    ]
}

这是获得用户在线状态的正确方法吗? (我知道FCM是正确的,但FCM目前尚未在app服务器端准备好)

更新2 : - 正如@XngPro推荐的代码我在doinBackground上实施

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;

2 个答案:

答案 0 :(得分:1)

我认为您应该使用像Gson这样的Java序列化/反序列化库。

希望能帮到你〜

示例

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;
        }
    }
}

答案 1 :(得分:0)

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;
            }
        }
    }

}  

打印
enter image description here