Android 收到消息聊天界面刷新,Android聊天界面刷新消息

本文介绍了作者初次使用线程实现Android应用中聊天消息刷新功能的经验。通过实现Runnable接口创建RefreshThread线程,根据await变量调整消息刷新间隔。在消息列表未变化时,延长刷新间隔,反之则立即刷新。线程与主线程间通过Handler进行通信,确保消息列表的及时更新。文章还展示了如何根据消息列表状态调整await值以及相关逻辑代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

};

};

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

原文:http://www.cnblogs.com/wucaiyun1/p/4837374.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值