我在代码中尽可能简单地做到了这一点.我在版本8-0.8.3中使用asmack库for android.
我的代码:
package info.zajacmp3.servercommunication;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class XmppService extends Service{
public void xmppService() throws XMPPException {
Connection conn1 = new XMPPConnection("jabber.org");
conn1.connect();
}
@Override
public void onCreate(){
//TODO:actions to perform when service is created
try {
xmppService();
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Replace with service binding
return null;
}
}
它冻结我的应用程序并导致我和错误:没有DNS解析器活动.网上没有关于它的任何内容.
我真的希望得到一些帮助或线索.
也试过这样:
private final static String server_host =“jabber.org”;
private final static int SERVER_PORT = 5222;
public void xmppService()throws XMPPException {
ConnectionConfiguration config = new ConnectionConfiguration( server_host, SERVER_PORT);
XMPPConnection m_connection = new XMPPConnection(config);
try {
SASLAuthentication.supportSASLMechanism("PLAIN");
config.setSASLAuthenticationEnabled(true);
m_connection.connect();
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
} catch (XMPPException e) {
e.printStackTrace();
}
}
@UPDATE:
使用smack库而不是asmack让我遇到同样的问题.
我没有得到错误日志,但在断开调试器后我得到:
解决方法:
我建议使用Smack而不是aSmack. Asmack是Smack的补丁和增强版本,aSmack有点死了.在Smack中,完成了代码重构,添加了一些新方法和重构的DNS类.
UPDATE
看到您的错误日志后,似乎是主UI线程上的网络调用问题
如何解决NetworkOnMainThread异常?
使用AsyncTask使您的网络调用在不同的线程(在后台)而不是在应用程序的主线程上.
将您的代码移动到AsynTask: –
private class ConnectToXmpp extends AsyncTask {
@Override
protected Void doInBackground(Void... params) {
ConnectionConfiguration config = new ConnectionConfiguration( server_host, SERVER_PORT);
XMPPConnection m_connection = new XMPPConnection(config);
try {
SASLAuthentication.supportSASLMechanism("PLAIN");
config.setSASLAuthenticationEnabled(true);
m_connection.connect();
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
} catch (XMPPException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
}
}
现在你可以执行你的AsyncTask: –
new ConnectToXmpp().execute();
有了这个,您的网络呼叫将在后台以不同的线程进行.
标签:smack,android,dns,xmpp
来源: https://codeday.me/bug/20190723/1509486.html