1.11Android 学习+进度之十一-多人聊天缓存

来源:互联网 发布:哪个加油软件好 编辑:程序博客网 时间:2024/06/03 22:44

现在实现了两个用户同时打开界面,然后可以进行聊天了,但是,假如A给B发,B没有打开呢,得有显示,而且显示后,点击进去,能显示之前的几条信息。

第一步,要解决,如何显示IP+信息数目的玩意。

终于解决了显示这个问题。用到的知识点是,SimpleAdapter及其相关,例如动态更新,如何显示等,贴上代码:

adapter = new SimpleAdapter(MainActivity.this, user_list,                            android.R.layout.simple_list_item_2, new String[] { "data1",                            "data2" }, new int[] { android.R.id.text1,                            android.R.id.text2 });                    user_list_view.setAdapter(adapter);
这是adapter的声明,第二个参数是ArrayList<Map<String, Object>> user_list;第三个参数是系统自带,关键是后面两个参数,是你显示的关键,我这个layout是要显示2行,那这两行分别要显示什么呢,map里面,key为“data1”,“data2”的数据,每一个item就是一个map。最后两个就是只是普通的text。贴上我的动态添加和动态删减代码:

 Map<String,Object> map= new HashMap<String, Object>();                        map.put("data1",message);                        map.put("data2",message);                        user_list.add(map);                        user_list_view.invalidateViews();
 Map<String,Object> map1;                        int i = 0;                        for(;i<user_list.size();i++)                        {                            map = user_list.get(i);                            if(map.get("data1").equals(message))                                break;                        }                        user_list.remove(i);                        user_list_view.invalidateViews();
分别对应动态添加和动态删减。我也想截图,公司电脑没权限,装不了模拟器,只有平板在显示,先稍微将就下。

下一步是加上,A和B聊天时,C给A发消息,A回退后能有显示。这步也很关键。需要一个变量存放,当前用户在和哪个ip的Activity聊天,现在要方便的查找,得设计个数据结构。关键点是,在用户删减的时候,这个数据结构怎么维护,尤其是删掉后,item是会提上来的,但是数据结构删掉后,并没有变。。想了想,先无视这个数据结构好了,用户没有想象这么大。。。。真是打脸,刚刚想着通过handler传数据过来,msg是msg,发送的ip呢;直接发msg带ip了,handler是可以发送类的(得可序列化的)。

然后,现在问题都解决了。关于是否要数据结构,现在的做法是:

case Constants.LIST_ADD:                        //user_ip2index.put(message,user_num);                        //user_num ++;//添加用户到表中                        ArrayList<String> user_chat  = new ArrayList<String>();                        user_chat_msg.put(message,user_chat);//存放聊天记录的地方                        Map<String,Object> map= new HashMap<String, Object>();                        map.put("IP",message);                        map.put("msg_num","0");                        if(message.equals("/"+CONSTANTS.LOC_IP))                            user_cut = (Map)map;                        user_list.add(map);                        user_list_view.invalidateViews();
不用数据结构,添加的时候,新建一个map,然后put,然后添加到list里面,更新。

删除的时候:

case Constants.LIST_SUB:                        Map<String,Object> map1;                        int i = 0;                        for(;i<user_list.size();i++)                        {                            map1 = user_list.get(i);                            if(map1.get("IP").equals(message))                                break;                        }                        user_list.remove(i);                        user_chat_msg.remove(message);//删除聊天记录的地方                        //user_list.remove(user_ip2index.get(message));                        user_list_view.invalidateViews();
直接循环查找对应的数据,然后删除。后面点击item,并不会用到寻找之类的。

其次,在A和B聊天时,C给A发送,此时,A的后台会接收该数据,然后并且显示。代码是:

case Constants.MESSAGET://肯定不是在本Activity                        //先检测现在焦点的Activity是不是数据的接收,否则就得存起来                        tmp_view.setText(message);                        if(msgtest.get_sendip().equals(user_cut.get("IP"))) //相等就广播                        {                            intent.putExtra("msg", message);                            MainActivity.this.sendBroadcast(intent);                        }                        else//需要存起来                        {                            user_chat_msg.get(msgtest.get_sendip()).add(message);                            Map<String,Object> map2;                            for(i = 0;i<user_list.size();i++)                            {                                map2 = user_list.get(i);                                if(map2.get("IP").equals(msgtest.get_sendip()))                                {                                    try {                                        Integer tmp = Integer.parseInt((String) map2.get("msg_num"));                                        tmp ++;                                        map2.put("msg_num",tmp.toString());                                        adapter.notifyDataSetChanged();                                    } catch (NumberFormatException e) {                                        e.printStackTrace();                                    }                                    break;                                }                            }                        }                        break;
存起来后,然后点击新的Activity,然后会把arraylist发过去(intent),然后假如有信息,就显示。

然后在onRestart()里面进行相关初始化的工作。目前工作稳定,暂无bug。

但是汇报工作后,感觉自己架构太烂,一点改进,就要伤筋动骨。下一章研究下这个吧。保存版本


原创粉丝点击