各位大虾,小虾朋友们好,我第一次开发这个功能遇到一个问题,希望大家能帮帮我。具体内容如下:我现在从服务端不定时接收消息,就是有其他人说话我就能收到,我现在把所有收到的信息全部放入队列了,ConcurrentLinkedQueue,然后自己写了一个线程专门来把队列里面的消息逐一更新UI上面,现在问题就出现了,我更新的内容其实有很多是重复的,比如我消息的ID是1~100,界面上面的是1到100的随机值,比如1,3,5,30……99,100,出现60个,最后那40个全部都是99.我想应该是线程没有同步的问题,但是不知道怎么弄!!!请高手帮忙~~~

解决方案 »

  1.   


    //网络层传有数据过来就自动调用此方法
    @Override
    public void receive(UserInfo info, int level) {
    // TODO Auto-generated method stub
    receiveQue.offer(info);//放入队列
    if (onPause)
    notification(info);
    // handler.sendEmptyMessage(RECEIVE_MSG);
    work.work();
    }protected class Work extends Thread { public synchronized void work() {
    notify();
    } @Override
    public synchronized void run() {
    // TODO Auto-generated method stub
    try {
    while (true) {
    if (receiveQue.size() > 0) {
    UserInfo info = receiveQue.poll();
    System.out.println(info.getMessage());
    } else {
    System.out.println("队列消息全部更新完毕,进入阻塞状态,除非有新消息过来!");
    wait();
    }
    }
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } }
      

  2.   

    这个后台打印是正常,OK没有问题的。主要是UI更新。handler的更新机制还不是很了解,所以估计问题是出自这里,我不知道界面什么时候更新完。
      

  3.   


    // id:0 与服务器连接断开了,马上重新连接!
    // 队列消息全部更新完毕,进入阻塞状态,除非有新消息过来!
    // id:1 与服务器连接断开了,马上重新连接!
    // 队列消息全部更新完毕,进入阻塞状态,除非有新消息过来!
    // id:2 与服务器连接断开了,马上重新连接!
    // 队列消息全部更新完毕,进入阻塞状态,除非有新消息过来!
    ......
      

  4.   

    handler队列的模式工作的,看看是不是内存或者其它数据被替换掉了!