没有网络连接时出现远程服务器错误(502)

时间:2014-11-10 16:42:48

标签: android xmpp smack asmack background-service

这是我在XMPP客户端和服务器之间建立连接然后使用后台服务登录的方法:

public class MessageService extends Service {
private String TAG = "MessageService";
private XMPPConnection connection;
private final IBinder mBinder = new MyBinder();

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return mBinder;
}

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "started");
    new Connect().execute("");
    return START_STICKY;
}

private class Connect extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration(
                SettingsDM.IP_ADDRESS, SettingsDM.PORT);

        XMPPConnection connection = new XMPPConnection(
                connectionConfiguration);
        Log.i(TAG, "getting ready to connect...");
        try {
            connection.connect();
            Log.i(TAG, "Connected to " + connection.getHost());
        } catch (XMPPException ex) {
            Log.e(TAG, "Failed to connect to " + connection.getHost());
            Log.e(TAG, ex.toString());
            setConnection(null);
        }
        try {
            connection.login(SettingsDM.TEST_USERNAME,
                    SettingsDM.TEST_PASSWORD);
            Log.i(TAG, "Logged in as " + connection.getUser());


            //setConnection(connection);
        } catch (XMPPException ex) {
            Log.e(TAG, "Failed to log in as " + SettingsDM.TEST_USERNAME);
            Log.e(TAG, ex.toString());
            setConnection(null);
        }
        return null;
    }
}
}

当有网络连接时,这可以正常工作。但是,当没有网络连接时,我希望在catch(XMPPException e)中捕获异常。但它没有被抓住,应用程序崩溃。后台服务也崩溃并尝试重启几次但仍然崩溃。

以下是错误日志:

11-10 16:14:20.909: E/MessageService(32759): Failed to connect to 192.168.1.4
11-10 16:14:20.910: E/MessageService(32759): XMPPError connecting to 192.168.1.4:5222.: remote-server-error(502) XMPPError connecting to 192.168.1.4:5222.
11-10 16:14:20.910: E/MessageService(32759):   -- caused by: java.net.ConnectException: failed to connect to /192.168.1.4 (port 5222): connect failed: ENETUNREACH (Network is unreachable)
11-10 16:14:20.956: E/AndroidRuntime(32759): FATAL EXCEPTION: AsyncTask #1
11-10 16:14:20.956: E/AndroidRuntime(32759): java.lang.RuntimeException: An error occured while executing doInBackground()
11-10 16:14:20.956: E/AndroidRuntime(32759):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.lang.Thread.run(Thread.java:856)
11-10 16:14:20.956: E/AndroidRuntime(32759): Caused by: java.lang.IllegalStateException: Not connected to server.
11-10 16:14:20.956: E/AndroidRuntime(32759):    at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:217)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at org.jivesoftware.smack.Connection.login(Connection.java:353)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at com.niilaryea.android.service.MessageService$Connect.doInBackground(MessageService.java:77)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at com.niilaryea.android.service.MessageService$Connect.doInBackground(MessageService.java:1)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
11-10 16:14:20.956: E/AndroidRuntime(32759):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-10 16:14:20.956: E/AndroidRuntime(32759):    ... 5 more
11-10 16:14:21.969: E/GraphicBufferAllocator(32759): FATAL: can't find the mmumapper module

当没有可用的网络连接时,如何防止后台服务和应用程序崩溃,而是在有可用的活动网络连接之前继续检查?

1 个答案:

答案 0 :(得分:0)

您有 java.net.ConnectException ,因此您应该使用例外而不是 XMPPException

相关问题