Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask从服务器检索信息时未返回所有结果_Android_Android Asynctask_Xmpp_Smack_Multiuserchat - Fatal编程技术网

Android AsyncTask从服务器检索信息时未返回所有结果

Android AsyncTask从服务器检索信息时未返回所有结果,android,android-asynctask,xmpp,smack,multiuserchat,Android,Android Asynctask,Xmpp,Smack,Multiuserchat,我正在开发一个Android应用程序,它使用Smack库连接到Openfire服务器。我有一个活动,它从onStart()方法调用AsyncTask来检索信息并将其添加到UI AsyncTask将使用Smack MultiUserManager类中的getHostedRooms()方法,循环遍历每个文件室,从文件室中获取JID值和主题字符串,并将该信息添加到哈希映射中。然后,该散列映射被返回到onPostExecute方法中的主线程 我遇到的问题是,异步任务通常不能提供所有正确的值。例如,有三个

我正在开发一个Android应用程序,它使用Smack库连接到Openfire服务器。我有一个活动,它从onStart()方法调用AsyncTask来检索信息并将其添加到UI

AsyncTask将使用Smack MultiUserManager类中的getHostedRooms()方法,循环遍历每个文件室,从文件室中获取JID值和主题字符串,并将该信息添加到哈希映射中。然后,该散列映射被返回到onPostExecute方法中的主线程

我遇到的问题是,异步任务通常不能提供所有正确的值。例如,有三个房间,它通常只返回一个或两个房间的信息,有时发送null而不是subject字符串

当我调试代码并一步一步地检查它时,它每次都会工作,所以我认为问题在于,在异步任务以全速运行时返回之前,不允许它调用循环中的每个步骤

是否有任何方法可以确保允许异步任务按预期完成并返回?我已经研究了asynctask.get()方法,但这似乎阻止了UI线程。我已经复制了下面的异步任务,如果您需要更多信息,请告诉我

编辑:只是澄清一下,每次输入到哈希映射中的所有键值都是不同的

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);
    }
}
私有类GetChatRoomData扩展异步任务{
私人语境;
私有字符串用户名、密码、返回消息;
专用XMPPTCP连接;
私有GetSubjectsCallBack回调;
私有GetChatRoomData(用户、GetSubjectScalBack回调、上下文){
this.context=上下文;
this.callBack=回调;
username=user.getUsername();password=user.getPassword();
returnMessage=“已找到主题”;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog.show();
}
@凌驾
受保护的HashMap doInBackground(无效…参数){
XMPPTCPConnectionConfiguration=XMPPTCPConnectionConfiguration.builder()
.SetUserName和password(用户名、密码)
.setServiceName(myservicename)
.setHost(“10.0.2.2”)
.setPort(5222).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.build();
HashMap returnmap=新的HashMap();
试一试{
连接=新的XMPPTCPConnection(配置);
连接。setPacketReplyTimeout(10000);
connection.connect();
连接。登录(用户名、密码);
MultiUserChatManager=MultiUserChatManager.getInstanceFor(连接);
List=manager.getHostedRooms(myservicename);
如果(list.size()!=0){
用于(客房:列表){
String jid=room.getJid();
多用户聊天tempMuc=
manager.getMultiUserChat(jid);
如果(!(tempMuc.isJoined()){
tempMuc.join(用户名);
}
字符串subject=tempMuc.getSubject();
returnmap.put(主题,jid);
}
}否则{
returnMessage=“尚未创建主题”;
}
连接断开();
}捕获(例外e){
returnMessage=“无法连接”;
}
返回地图;
}
@凌驾
受保护的void onPostExecute(HashMap映射){
progressDialog.disclose();
callBack.done(返回消息,映射);
super.onPostExecute(map);
}
}

我找到了解决方案,将在此处发布以备将来使用。原来问题出在for循环中对join()的调用上。有时,在调用getSubject()之前不会建立连接,当发生这种情况时,subject返回null。如果这种情况发生多次,那么将使用键“null”输入多个值,从而返回一个不完整的哈希映射


我目前的解决方案是在join()之后调用Thread.sleep(),以确保建立连接。如果无法建立连接,将引发异常。可能不是最好的解决方案,但它是有效的

我找到了解决方案,将在这里发布供将来使用。原来问题出在for循环中对join()的调用上。有时,在调用getSubject()之前不会建立连接,当发生这种情况时,subject返回null。如果这种情况发生多次,那么将使用键“null”输入多个值,从而返回一个不完整的哈希映射


我目前的解决方案是在join()之后调用Thread.sleep(),以确保建立连接。如果无法建立连接,将引发异常。可能不是最好的解决方案,但它是有效的

在HashMap中,可能不止一个值具有相同的键“subject's value”,因此循环会覆盖这些值。@SaNtoRiaN为建议喝彩,但已经检查了这一点,事实并非如此,每个房间都有不同的subject顺便说一句,移动部分super.onPostExecute(map);到方法onPostExecuteThanks的第一行。仍然不起作用,但不管怎样,最好知道。可能在HashMap中有不止一个具有相同键“subject's value”的值,因此循环会覆盖这些值。@SaNtoRiaN为建议喝彩,但已经检查了这一点,事实并非如此,每个房间都有一个不同的subject顺便说一句,将部分移动到super.onPostExecute(map);到方法onPostExecuteThanks的第一行。仍然不起作用,但不管怎样,很高兴知道。