Android聊天界面刷新消息

今天,我想来分享一下自己初用线程的感受,虽然写法略显粗糙,并没有用线程Thread中核心的Looper,MessageQueue消息队列这些知识,正因为是初学线程,所以就只用最基础的来写了,慢慢学习优化改进。

上一节“Android中Thread的2种实现方法”中介绍过Android中Thread的2种实现方法,今天我用的是后一种,通过实现Runnable接口来实现我刷新聊天消息的线程RefreshThread。


private class RefreshThread implements Runnable{
        private int await = 0;
        private boolean flag = true;
        @Override
        public void run() {
            while (flag) {
                try {
                    Message message =new Message();
                    message.what = 1;
                    handler.sendMessage(message);
                    Thread.sleep(await());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }   
        }
        public void setFlag(boolean flag) {
            this.flag = flag;
        }
        public long await(){
            if(await > 13){
                return 60000L;
            }
            if (await > 6) {
                return 20000L;
            }
            return await < 3 ? 10000L:15000L;
        }
       public void setAwait(int await) {
            this.await = await;
        }
        public void ascAwait(){           
            await ++;
        }
     }

这个线程里呢最核心的就是await()这个方法了,当await这个变量<3时,Thread.sleep()线程睡眠10s,当然也就是我们的消息10s刷新一次;

当(await>3&&await<6)的时候,消息15s刷新一次;依次可以看出,await>6时,消息20s刷新一次;await>13时,消息一分钟刷新一次。那说了这么久,

await这个变量到底是什么呢?通过下面的这段代码一看便知,当我们去比较消息列表的长度值时,列表值刷新前与刷新后的size如果是没变化的话,那我们的await++,

对应线程就是refreshThread.ascAwait()这个方法,这个意思那就是说如果一直没人发消息,那我们刷新的时间就会变久,对应刷新的时间可能是10s,15s,20s,甚至一分钟;如果有人发消息,消息列表的值不等了的情况下,我们就要将await值赋值为0,这样就会及时刷新。


case i_getMessageInfo:
            ChatMsg chatMsg=ChatMsgData.getChatMsg();
            if(ViewUtil.isNotEmpty(chatMsg)){
                if (Integer.parseInt(chatMsg.getState().toString())>0)
                {
                    synchronized(this) {
                        List<ChatMsgList> chatMsgList=chatMsg.getChatmsglist();
                        size=chatMsgLists.size();
                        chatMsgLists.clear();
                        chatMsgLists.addAll(chatMsgList);
                        myAdapter.notifyDataSetChanged();
                        listView.setSelection(chatMsgLists.size());
                        if (chatMsgLists.size() == size) {
                                    refreshThread.ascAwait();
                              }else {
                                    refreshThread.setAwait(0);
                              }
                    }       
                }
                else
                {
                    showToast("获取消息列表未成功", false);
                }
            }
            break;

当然,线程之间交互是少不了Handler这个机制,通过handler来去通知主线程去更新消息列表,以便做消息列表size大小的比较。


private Handler handler = new Handler(){
        @Override
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 1:
                sendToBackgroud(OperateCode.i_getMessageInfo,new String[]{PersonalID,""});
                break;
            default:
                break;
            }
            super.handleMessage(msg);
        };
    };

好,那么这就是我用线程来去刷新消息的理解与实现。

时间: 2024-11-03 16:58:26

Android聊天界面刷新消息的相关文章

Android之界面刷新(invalidate和postInvalidate使用)

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在

Android 聊天界面

界面: 1.主界面 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_pa

环信UI开源Demo情景分析十二、聊天界面(四)

在这一章咱们来分析一下聊天界面中消息的显示,MessageAdapter. public MessageAdapter(Context context, String username, int chatType) { this.username = username; this.context = context; inflater = LayoutInflater.from(context); activity = (Activity) context; this.conversation

iOS开发——UI_swift篇&amp;TableView自定义聊天界面

TableView自定义聊天界面 1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 (3)每条消息旁边有头像,在左边表示发送方,在右边表示接收方 2,实现思路 (1)需要定义一个数据结构保存消息内容 MessageItem (2)继承UITableViewCell实现自定义单元格,这里面放入头像和消息体 (3)继承UITableView实现自定义表格,通过读取数据源,进行页面的渲染

Swift - 自定义单元格实现微信聊天界面

1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 (3)每条消息旁边有头像,在左边表示发送方,在右边表示接收方 2,实现思路 (1)需要定义一个数据结构保存消息内容 MessageItem (2)继承UITableViewCell实现自定义单元格,这里面放入头像和消息体 (3)继承UITableView实现自定义表格,通过读取数据源,进行页面的渲染 (4)消息体根据内容类型不同,用不

Android学习笔记(十二)——实战:制作一个聊天界面

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Patch图片是一种被特殊处理过的 png 图片,能够指定哪些区域可以被拉伸而哪些区域不可以.一般用来作为聊天信息的背景.在此我们先准备一张png图片.然后在 Android sdk 目录下有一个 tools 文件夹,在这个文件夹中找到 draw9patch.bat文件. 双击打开之后, 在导航栏点击 File→

android#编写一个聊天界面

摘自<第一行代码>——郭霖 既然是要编写一个聊天界面,那就肯定要有收到的消息和发出的消息.上一节中我们制作的message_left.9.png可以作为收到消息的背景图,那么毫无疑问你还需要再制作一张message_right.9.png作为发出消息的背景图.图片都提供好了之后就可以开始编码了,首先还是编写主界面,修改activity_main.xml中的代码,如下所示: <LinearLayout xmlns:android="http://schemas.android.c

自定义android精美聊天界面

编写精美聊天界面,那就肯定要有收到的消息和发送的消息. 首先还是编写主界面,修改activity_chat.xml中的代码,如下所示: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_par

Android—简单的仿QQ聊天界面

最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,): 其中聊天背景可以是一个LinearLayout或者RelativeLayout里面存放的是ListView(将ListView的分割线设置成透明:android:divider="#0000"否则聊天界面会显示出分割线,,,想想都屌,,,) 于是,我要上主界面的xml布局文件了: <?xml version="1.0" encoding="utf-8"?&g