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