从服务端获取朋友列表的时候遇到的坑

// 新开线程,向服务端发送一个请求朋友列表的包
        new Thread() {
            @Override
            public void run() {
                try {
                    RequestFriendsPacket packet = new RequestFriendsPacket(username);
                    Socket socket = new Socket("10.0.2.2", 2018);
                    OutputStream out = socket.getOutputStream();
                    InputStream in = socket.getInputStream();

                    out.write(packet.serialize());
                    out.flush();

                    byte[] buffer = new byte[1024];
                    int length = in.read(buffer);
                    String friendsInThread = new String(buffer, 0, length);

                    // 通过消息机制修改主线程中的friends
                    Message message = new Message();
                    message.what = 0x0001;
                    message.obj = friendsInThread;
                    mainActHandler.sendMessage(message);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();

这样就得到了朋友列表信息(friends),然后拆解这个字符串数组得到一组朋友的名字,如下所示

String allFriends[] = friends.split("[|]");// 拆解得到本用户所有的朋友
for (int i = 0; i < allFriends.length; i++)
	Log.d("friends=====", allFriends[i]);

然后初始化RecyerView中的聊天摘要列表(chatItemList)即可。

不过这里要注意几个问题(也就是我遇到的坑,呜呜): 1、请求好友信息(friends)的线程跑的是比主线程慢的,所以原本在主线程中执行的initFragment();是要放在Handler中的,这里的Handler是处理子线程请求完成后发送给主线程的消息的,一定要在这里初始化我们的Fragment,不然会导致Fragment的聊天摘要的朋友名字缺失。我写的Handler如下:

public Handler mainActHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x0001) {
                friends = (String) msg.obj;
                Log.d("mainActHandler===", friends + "====");
//                fragments[0] = new WeixinFragment(friends);
                initFragment();
            }
        }
    };在这里插入代码片

2、在Fragment中获取与之关联的Activity时,最好放在方法体中而不要放在外面,因为放在外面的话有可能不会执行,如下所示:

3、请求好友列表信息(friends)时,向服务端写完数据一定要马上读取服务端返回的数据,不然等当前socket关掉了的话,在程序其他位置在创建socket是无法得到这个socket的,更别提获取他的数据了(小白水平有限,在这个地方卡了好久……)

经验分享 程序员 微信小程序 职场和发展