今天,我想来分享一下自己初用线程的感受,虽然写法略显粗糙,并没有用线程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 ++;
}
}

RefreshThread

这个线程里呢最核心的就是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;

i_getMessageInfo

当然,线程之间交互是少不了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);
};
};

handler

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

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

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

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ...

  2. RV 多样式 MultiType 聊天界面 消息类型 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. iOS开发——UI_swift篇&TableView自定义聊天界面

    TableView自定义聊天界面   1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 ...

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

    1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 (3)每条消息旁边有头像,在左边表示 ...

  5. Android—简单的仿QQ聊天界面

    最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,):

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

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

  7. 自定义android精美聊天界面

    编写精美聊天界面,那就肯定要有收到的消息和发送的消息. 首先还是编写主界面,修改activity_chat.xml中的代码,如下所示: <?xml version="1.0" ...

  8. android#编写一个聊天界面

    摘自<第一行代码>——郭霖 既然是要编写一个聊天界面,那就肯定要有收到的消息和发出的消息.上一节中我们制作的message_left.9.png可以作为收到消息的背景图,那么毫无疑问你还需 ...

  9. Android界面刷新之invalidate与postInvalidate的区别

    Android的invalidate与postInvalidate都是用来刷新界面的. 在UI主线程中,用invalidate():本质是调用View的onDraw()绘制. 主线程之外,用postI ...

随机推荐

  1. flex中DataGrid里使用itemRenderer后数据无法绑定到数据源的问题

    <?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="ht ...

  2. JDBC连接各种数据库的方法(经典)

    1)连接Oracle 8/8i/9i/10g/11g(thin模式) Class.forName("oracle.JDBC.driver.OracleDriver").newIns ...

  3. GLSL实现Image Filter 【转】

    http://blog.csdn.net/a3070173/archive/2008/11/27/3390477.aspx 图像过滤无论是在作图工具还是特效的实现上都时有运用,这里发一些通常会使用到的 ...

  4. JavaScript中事件捕获(Event capturing)-------------->由外向内,事件冒泡(Event bubblin)---------->由内向外

    addEventListener("click", function() {}, useCapture:false); <!DOCTYPE html> <html ...

  5. [Angular 2] Generate and Render Angular 2 Template Elements in a Component

    Angular 2 Components have templates, but you can also create templates inside of your templates usin ...

  6. [Express] Level 2: Middleware -- 1

    Mounting Middleware Given an application instance is set to the app variable, which of the following ...

  7. NopCommerce使用Autofac实现依赖注入

    NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...

  8. shell 笔记

    shell 笔记 通配符 没有 '.' [Aa] 表示 A 或者 a ? 表示任意字符 * 表示任意字符串 IFS data='name, sex, rollno, location' oldIFS= ...

  9. 用 Gearman 分发 PHP 应用程序的工作负载

    尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面.如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应.实 ...

  10. DOS命令如何进入指定的下一级目录?

    如cd E:\java workspace\test\src 如何进入E盘 ,直接 E: