2014-10-21 4 views
1

Я разрабатываю приложение для Android-чата, которое использует библиотеку asmack. Я наблюдаю, что beocmes соединения XMPP отключается через определенный промежуток времени. (Это также зависит от устройства)Соединение Android XMPP не является постоянным - библиотека asmack даже работает в отдельной теме

Я стереосистеме и обновите код подключения в отдельном потоке, как указано в приведенной ниже ссылке

Can't establish a new connection with aSmack 4.0.2

Но я получаю следующее исключение

D/Reconnection Manager(23105): scheduleReconnect: calling tryToConnect 
I/System.out(23105): default ping interval is :10 
W/System.err(23105): org.jivesoftware.smack.SmackException$ConnectionException 
W/System.err(23105): at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:436) 
W/System.err(23105): at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:811) 
W/System.err(23105): at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:396) 
W/System.err(23105): at com.connectlinks.service.ChatService.connectToXmppServer(ChatService.java:309) 
W/System.err(23105): at com.connectlinks.service.ChatService.access$0(ChatService.java:291) 
W/System.err(23105): at com.connectlinks.service.ChatService$3.run(ChatService.java:280) 
W/System.err(23105): at android.os.Handler.handleCallback(Handler.java:733) 
W/System.err(23105): at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err(23105): at android.os.Looper.loop(Looper.java:136) 
W/System.err(23105): at android.app.ActivityThread.main(ActivityThread.java:5586) 
W/System.err(23105): at java.lang.reflect.Method.invokeNative(Native Method) 
W/System.err(23105): at java.lang.reflect.Method.invoke(Method.java:515) 
W/System.err(23105): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
W/System.err(23105): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
W/System.err(23105): at dalvik.system.NativeStart.main(Native Method) 

Не знаю, где я ошибаюсь. Я узнал из многих вопросов SO, связанных с подключением/повторным подключением в отдельном потоке. Но не происходит для меня ...

Ниже в блоки кода, которые я использую

Ниже здесь я сначала подключиться к серверу XMPP и все хорошо

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
....... 
startXmppThread(); 
....... 
} 

ниже блок кода, где Я начинаю XMPP нить

public void startXmppThread(){ 
    isConnecting = true; 
    SmackAndroid.init(ChatService.this); 
    PingManager.setDefaultPingInterval(10); 
    SmackConfiguration.setDefaultPacketReplyTimeout(20000); 
    if(xmppThread == null){ 
     xmppThread=new Thread(xmppRunnable,"connection thread"); 
     xmppThread.start(); 
    } 
} 

XMPP работоспособной код

Runnable xmppRunnable = new Runnable() { 

    @Override 
    public void run() { 
     Log.d(TAG,"starting now thread :"+Thread.currentThread().getId()+" : "+Thread.currentThread().getName()); 
     Looper.prepare(); 
     try{ 
      connectToXmppServer(); 
      handler.post(mRunnableConnectionMonitor); 
     }catch (Exception e) { 
      //handler.removeCallbacks(mRunnableConnectionMonitor); 
      Log.d(TAG, "Trying to Reconnect from the run catch exception"); 
      scheduleReconnect(); 
      e.printStackTrace(); 

     } 

     xyzz = new Handler(new Handler.Callback() { 

      @Override 
      public boolean handleMessage(android.os.Message msg) { 
       switch (msg.arg1) { 
       case 1: 
        Log.d(TAG, "Got Message to connect again"); 
        try { 
         connectToXmppServer(); 
         handler.post(mRunnableConnectionMonitor); 
        } catch (Exception e) { 
         //handler.removeCallbacks(mRunnableConnectionMonitor); 
         Log.d(TAG,"Trying to reconnect from the handleMessage case 1"); 
         scheduleReconnect(); 
         e.printStackTrace(); 
        } 
        break; 

       case 2: 
        Log.d(TAG, "Got Message to disconnect"); 
        handler.removeCallbacks(mRunnableConnectionMonitor); 
        try { 
         connection.disconnect(); 
         Log.d(TAG, "succesfully disconnected"); 
        }catch (Exception e) { 
         Log.d(TAG, "Exception while disconnecting"); 
         e.printStackTrace(); 
        } 
        break; 
       case 3: 
        Log.d(TAG,"Trying to reconnect from the handleMessage case 3"); 
        scheduleReconnect(); 
        handler.removeCallbacks(mRunnableConnectionMonitor); 
        break; 
       default: 
        break; 
       } 
       return false; 
      } 
     }); 
     Looper.loop(); 
    } 
}; 

код блока, который подключается к серверу XMPP

private void connectToXmppServer() throws Exception { 
     if(config ==null) 
      config = new ConnectionConfiguration(CHAT_SERVER_IP, 5222,host); 
     config.setSecurityMode(SecurityMode.disabled); 
     config.setSendPresence(true); 
     config.setRosterLoadedAtLogin(false); 
     if(connection == null) 
      connection = new XMPPTCPConnection(config); 


     if(mPingManager == null) 
      mPingManager = PingManager.getInstanceFor(connection); 
     mPingManager.unregisterPingFailedListener(mPingFailedListener); 
     mPingManager.registerPingFailedListener(mPingFailedListener); 
     System.out.println("default ping interval is :"+mPingManager.getPingInterval()); 
     if(!connection.isConnected()) 
      connection.connect(); 

     if(!ConnectlinksApp.m_sharedHelper.getChatRegistration()){ 
      String mobileID = ConnectlinksApp.m_sharedHelper.getMobileID(); 
      Log.d(TAG, "trying to register with : "+mobileID); 
      AccountManager accountManager=AccountManager.getInstance(connection); 
      try{ 
       accountManager.createAccount(mobileID, m_strUserPassword); 
       Log.d(TAG, "account created successfully"+mobileID); 
      }catch (Exception e) { 
       Log.d(TAG, "account already exist"+mobileID); 
       e.printStackTrace(); 
      } 
      ConnectlinksApp.m_sharedHelper.setChatRegistration(true); 
     } 

     if(!connection.isAuthenticated()){ 
      login(); 
     } 
} 

Код блока whicj подключится к серверу XMPP

protected void scheduleReconnect() { 
    if (mReconnectHandler == null) mReconnectHandler = new Handler(); 
    mReconnectHandler.removeCallbacks(mReconnectRunnable); 
    Log.d("Schedule Reconnect","scheduleReconnect: scheduling reconnect in 10 seconds"); 
    mReconnectHandler.postDelayed(mReconnectRunnable, 10000); 
} 

с выполняемым, который воссоединяет

private final Runnable mReconnectRunnable = new Runnable() { 
    @Override 
    public void run() { 
     Log.d("Reconnection Manager","scheduleReconnect: calling tryToConnect"); 
     try{     
      connectToXmppServer(); 
      handler.post(mRunnableConnectionMonitor); 
      Log.d(TAG, "This shold be called"); 
     }catch (Exception e) { 
     // handler.removeCallbacks(mRunnableConnectionMonitor); 
      e.printStackTrace(); 
      scheduleReconnect(); 
     } 
    } 
}; 

Я пробовал все возможности, но не могут прийти к решению. Может ли кто-нибудь, кто столкнулся с такой же проблемой, может мне помочь. Спасибо за ваше время, чтобы прочитать длинный пост.

******************* EDIT ********************** Журнал исключений is

10-23 19:48:50.866 I/System.out(15248): This is what I am looking for beginning 
10-23 19:48:50.876 E/ERROR (15248): ConnectionException 
10-23 19:48:50.876 E/ERROR (15248): org.jivesoftware.smack.SmackException$ConnectionException 

10-23 19:48:50.876 E/ERROR (15248): at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:436) 

10-23 19:48:50.876 E/ERROR (15248): at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:811) 

10-23 19:48:50.876 E/ERROR (15248): at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:396) 

10-23 19:48:50.876 E/ERROR (15248): at com.connectlinks.service.ChatService.connectToXmppServer(ChatService.java:314) 

10-23 19:48:50.876 E/ERROR (15248): at com.connectlinks.service.ChatService.access$0(ChatService.java:293) 

10-23 19:48:50.876 E/ERROR (15248): at com.connectlinks.service.ChatService$3.run(ChatService.java:281) 

10-23 19:48:50.876 E/ERROR (15248): at android.os.Handler.handleCallback(Handler.java:733) 

10-23 19:48:50.876 E/ERROR (15248): at android.os.Handler.dispatchMessage(Handler.java:95) 

10-23 19:48:50.876 E/ERROR (15248): at android.os.Looper.loop(Looper.java:136) 

10-23 19:48:50.876 E/ERROR (15248): at android.app.ActivityThread.main(ActivityThread.java:5586) 

10-23 19:48:50.876 E/ERROR (15248): at java.lang.reflect.Method.invokeNative(Native Method) 

10-23 19:48:50.876 E/ERROR (15248): at java.lang.reflect.Method.invoke(Method.java:515) 

10-23 19:48:50.876 E/ERROR (15248): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 

10-23 19:48:50.876 E/ERROR (15248): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 

10-23 19:48:50.876 E/ERROR (15248): at dalvik.system.NativeStart.main(Native Method) 

10-23 19:48:50.885 E/ERROR (15248): 54.215.XXX.YYY:5222 Exception: null 

10-23 19:48:50.885 I/System.out(15248): This is what I am looking for end 

******************* Конец журнала об исключении ******************* **********

Таким образом, это означает, что он не может идентифицировать сервер чата, но он работает и работает.

Есть ли какие-то настройки, которые мне нужно сделать на сервере Ejabberd. Очень смутно. Pls. Помоги мне.

код, который я использовал, чтобы получить исключение составляет

System.out.println("This is what I am looking for beginning"); 
      Log.e("ERROR", "ConnectionException", e); 
      for (int i = 0; i < e.getFailedAddresses().size(); i++) { 
       HostAddress element = e.getFailedAddresses().get(i); 
       Log.e("ERROR", element.getErrorMessage().toString()); 
      } 
      System.out.println("This is what I am looking for end"); 

********************** EDIT ****** *******************

После дальнейших исследований я узнал, что метод connectToXmppServer находится в Runnable.

Runnable xmppRunnable = new Runnable() {  
     @Override 
    public void run() { 
     ..... 
     connectToXmppServer(); 
     .....    
     } 
} 

Таким образом, изменил Runnable на тему, как этот

Thread xmppRunnable = new Thread(){ 

После этого, хорошая новость заключается в том, что я не в состоянии решить этот вопрос (который пользователь переходит в автономный режим в несколько часы) я получаю исключение, которое гласит, что исключение составляет NetworkOnMainThreadException

I/System.out(10663): NOT CONNECTED 

I/System.out(10663): TRYING TO CONNECT 

I/System.out(10663): SSmackThis is what I am looking for beginning 

I/System.out(10663): SSmackYour localized messagenull 

I/System.out(10663): SSmackYour Messagenull 

E/ERROR (10663): SConnectionException 

E/ERROR (10663): org.jivesoftware.smack.SmackException$ConnectionException 

E/ERROR (10663): at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:436) 

E/ERROR (10663): at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:811) 

E/ERROR (10663): at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:396) 

E/ERROR (10663): at com.connectlinks.service.ChatService.connectToXmppServer(ChatService.java:326) 

E/ERROR (10663): at com.connectlinks.service.ChatService.access$0(ChatService.java:293) 

E/ERROR (10663): at com.connectlinks.service.ChatService$3.run(ChatService.java:281) 

E/ERROR (10663): at android.os.Handler.handleCallback(Handler.java:733) 

E/ERROR (10663): at android.os.Handler.dispatchMessage(Handler.java:95) 

E/ERROR (10663): at android.os.Looper.loop(Looper.java:136) 

E/ERROR (10663): at android.app.ActivityThread.main(ActivityThread.java:5586) 

E/ERROR (10663): at java.lang.reflect.Method.invokeNative(Native Method) 

E/ERROR (10663): at java.lang.reflect.Method.invoke(Method.java:515) 

E/ERROR (10663): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 

E/ERROR (10663): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 

E/ERROR (10663): at dalvik.system.NativeStart.main(Native Method) 

I/System.out(10663): MYERRORorg.jivesoftware.smack.SmackException$ConnectionException 

I/System.out(10663): SThis is what I am looking for middle 

E/SSSERROR(10663): android.os.NetworkOnMainThreadException 

I/System.out(10663): SSSERROR android.os.NetworkOnMainThreadException 

E/SERROR (10663): 54.XXX.XXX.XXX:5222 Exception: null 

I/System.out(10663): SERROR 54.XXX.XXX.XXX:5222 Exception: null 

I/System.out(10663): SThis is what I am looking for end 

Не знаю, почему я получаю это исключение т hough я запускаю его в отдельную нить. Любые указатели были бы очень полезны для меня. Надеюсь, этот SO-вопрос принесет пользу всем, кто столкнулся с этой проблемой.

+0

Каковы неудачные хосты и причины их отказа, указанные в ConnectionException? – Flow

+0

@Flow - Большое спасибо за то, что вернулись ко мне. Я проверю это и дам вам знать. Еще раз спасибо. –

+0

@Flow - чтобы имитировать это исключение, потребуется час. FYI. –

ответ

0

После долгой борьбы, вот мои наблюдения, и я смог найти решение проблемы. Любая обратная связь о моем решении приветствуется.

Редактирование содержит ответ.

Я просто изменил код из Runnable на тему

Когда код, который подключается к серверу чата был в Runnable, я получил android.os.NetworkOnMainThreadException. По какой-то причине я не могу найти трассировку стека NetworkOnMainThreadException. В ConnectionConfiguration выполнялось свойство NetworkOnMainThreadException, когда соединение выполняется с помощью Runnable.

Надеюсь, что это поможет кому-то, кто сталкивается с подобной проблемой с моей. Я искренне благодарю @Flow за его усилия, направленные на то, чтобы помочь мне решить эту проблему. Ваша работа с ударом очень похвальна и благословение для сообщества Android.

См. Прикрепленное изображение для исключения. enter image description here

+0

и что вы сделали, чтобы исправить это? Вы только что изменились с runnabel на поток, и это помогает? Не могли бы вы показать пример? – Opiatefuchs

0

Это будет лучше использовать AsyncTask для подключения в вашем коде, а не с помощью Thread.It не рекомендуется использовать тему в Android.Try AsyncTask, он используется для всех целей, связанных соединений.

class ConnectServer extends AsyncTask<Void, Void, XMPPConnection> { 

}