从服务端获取朋友列表的时候遇到的坑
// 新开线程,向服务端发送一个请求朋友列表的包
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的,更别提获取他的数据了(小白水平有限,在这个地方卡了好久……)
