Android 从服务器检索信息时,AsyncTask 未返回所有结果
Android AsyncTask not returning all results when retrieving information from server
我正在开发一个 Android 应用程序,它使用 Smack 库连接到 Openfire 服务器。我有一个 activity,它从 onStart() 方法调用 AsyncTask 来检索信息并将其添加到 UI。
AsyncTask 将使用 Smack MultiUserManager class 中的 getHostedRooms() 方法,遍历每个房间并从房间获取 JID 值和主题字符串,将该信息添加到哈希映射中。然后该哈希映射 returned 到 onPostExecute 方法中的主线程。
我遇到的问题是异步任务通常不会提供所有正确的值。比如有三个房间,往往只会return一两个的信息,有时会发送null而不是主题字符串。
当我调试代码并逐步执行它时,它每次都有效,所以我认为问题是不允许 asynctask 调用它之前的循环中的每一步 return s 当 运行 全速运行时。
有什么方法可以确保允许异步任务完成并且 return 如预期的那样?我查看了 asynctask.get() 方法,但这似乎阻止了 UI 线程。我已经复制了下面的 AsyncTask,如果您需要更多信息,请告诉我!
编辑:澄清一下,每次输入哈希映射的所有键值都不相同
private class GetChatRoomData extends AsyncTask<Void, Void, HashMap<String, String>> {
private Context context;
private String username, password, returnMessage;
private XMPPTCPConnection connection;
private GetSubjectsCallBack callBack;
private GetChatRoomData(User user, GetSubjectsCallBack callBack, Context context) {
this.context = context;
this.callBack = callBack;
username = user.getUsername(); password = user.getPassword();
returnMessage = "Subjects found";
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
@Override
protected HashMap<String, String> doInBackground(Void... params) {
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword(username, password)
.setServiceName(myservicename)
.setHost("10.0.2.2")
.setPort(5222).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.build();
HashMap<String, String> returnmap = new HashMap<String, String>();
try {
connection = new XMPPTCPConnection(config);
connection.setPacketReplyTimeout(10000);
connection.connect();
connection.login(username, password);
MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
List<HostedRoom> list = manager.getHostedRooms(myservicename);
if(list.size() != 0) {
for (HostedRoom room : list) {
String jid = room.getJid();
MultiUserChat tempMuc =
manager.getMultiUserChat(jid);
if (!(tempMuc.isJoined())) {
tempMuc.join(username);
}
String subject = tempMuc.getSubject();
returnmap.put(subject, jid);
}
} else {
returnMessage = "No topics created yet";
}
connection.disconnect();
} catch (Exception e) {
returnMessage = "Could not connect";
}
return returnmap;
}
@Override
protected void onPostExecute(HashMap<String, String> map) {
progressDialog.dismiss();
callBack.done(returnMessage, map);
super.onPostExecute(map);
}
}
我找到了解决方案,将post放在这里以备将来使用。原来问题出在 for 循环中对 join() 的调用。有时在调用 getSubject() 之前不会建立连接,当这种情况发生时,主题返回为 null。如果这种情况发生多次,那么将使用键 'null' 放入多个值,从而返回不完整的哈希映射。
我目前的解决方案是在join() 之后调用Thread.sleep() 以确保建立连接。如果无法建立连接,则抛出异常。可能不是最好的解决方案,但它确实有效。
我正在开发一个 Android 应用程序,它使用 Smack 库连接到 Openfire 服务器。我有一个 activity,它从 onStart() 方法调用 AsyncTask 来检索信息并将其添加到 UI。
AsyncTask 将使用 Smack MultiUserManager class 中的 getHostedRooms() 方法,遍历每个房间并从房间获取 JID 值和主题字符串,将该信息添加到哈希映射中。然后该哈希映射 returned 到 onPostExecute 方法中的主线程。
我遇到的问题是异步任务通常不会提供所有正确的值。比如有三个房间,往往只会return一两个的信息,有时会发送null而不是主题字符串。
当我调试代码并逐步执行它时,它每次都有效,所以我认为问题是不允许 asynctask 调用它之前的循环中的每一步 return s 当 运行 全速运行时。
有什么方法可以确保允许异步任务完成并且 return 如预期的那样?我查看了 asynctask.get() 方法,但这似乎阻止了 UI 线程。我已经复制了下面的 AsyncTask,如果您需要更多信息,请告诉我!
编辑:澄清一下,每次输入哈希映射的所有键值都不相同
private class GetChatRoomData extends AsyncTask<Void, Void, HashMap<String, String>> {
private Context context;
private String username, password, returnMessage;
private XMPPTCPConnection connection;
private GetSubjectsCallBack callBack;
private GetChatRoomData(User user, GetSubjectsCallBack callBack, Context context) {
this.context = context;
this.callBack = callBack;
username = user.getUsername(); password = user.getPassword();
returnMessage = "Subjects found";
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
@Override
protected HashMap<String, String> doInBackground(Void... params) {
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword(username, password)
.setServiceName(myservicename)
.setHost("10.0.2.2")
.setPort(5222).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.build();
HashMap<String, String> returnmap = new HashMap<String, String>();
try {
connection = new XMPPTCPConnection(config);
connection.setPacketReplyTimeout(10000);
connection.connect();
connection.login(username, password);
MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
List<HostedRoom> list = manager.getHostedRooms(myservicename);
if(list.size() != 0) {
for (HostedRoom room : list) {
String jid = room.getJid();
MultiUserChat tempMuc =
manager.getMultiUserChat(jid);
if (!(tempMuc.isJoined())) {
tempMuc.join(username);
}
String subject = tempMuc.getSubject();
returnmap.put(subject, jid);
}
} else {
returnMessage = "No topics created yet";
}
connection.disconnect();
} catch (Exception e) {
returnMessage = "Could not connect";
}
return returnmap;
}
@Override
protected void onPostExecute(HashMap<String, String> map) {
progressDialog.dismiss();
callBack.done(returnMessage, map);
super.onPostExecute(map);
}
}
我找到了解决方案,将post放在这里以备将来使用。原来问题出在 for 循环中对 join() 的调用。有时在调用 getSubject() 之前不会建立连接,当这种情况发生时,主题返回为 null。如果这种情况发生多次,那么将使用键 'null' 放入多个值,从而返回不完整的哈希映射。
我目前的解决方案是在join() 之后调用Thread.sleep() 以确保建立连接。如果无法建立连接,则抛出异常。可能不是最好的解决方案,但它确实有效。