2012-04-11 3 views
0

Google 토크 서비스에 연결하는 Android 용 채팅 클라이언트를 구현하려고합니다. 나는 그것의 대부분을했는데, 나는 서버에 연결하고, 연락처를 얻고 ListView에 보여주고 메시지가 보내고받는 목록의 연락처 이름을 클릭 할 때 새로운 활동을 연다. 내 문제는 이제 사용자 계정의 연락처가 있는지 확인하려고한다는 것입니다. 나는이 코드를 작성했으나 작동하지 않으며 이유를 찾을 수 없다. 어떤 도움을 주셔서 감사합니다.연락처를 검색 할 수 없습니다. Google 토크 서비스 연결을 위해Smack 라이브러리를 사용하여 현재 상태를 표시합니다.

Button connect = (Button) findViewById(R.id.connect); 
    connect.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 

      String username = getTheText(R.id.UserName); 
      String password = getTheText(R.id.Password); 

      login(username, password); 
      try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e1) { 
     e1.printStackTrace(); 
     } 
      roster = connection.getRoster(); 

      entries = roster.getEntries(); 
      arrayOfEntries = new ArrayList<RosterEntry>(entries); 
      searchedContacts = GetSearchContacts();\\This method is the one who is not working correctly 

      try{ 

       launchNextActivity(); 

      }catch(Exception e){ 
       e.printStackTrace(); 

      } 

     } 


    }); 
    /* 
* Asigna los datos del ArrayList de RosterEntry al ArraList de SearchContacts 
*/ 

private ArrayList<SearchContacts> GetSearchContacts(){ 
    ArrayList<SearchContacts> results = new ArrayList<SearchContacts>(); 
     \\The class SearchContacts is an own class very simple with a constructor which assigns 4 parameters to the objects of the class, and getters and setters for every parameter. 
    for (RosterEntry r : arrayOfEntries){ 
     SearchContacts sc = new SearchContacts(null, null,null,null); 
     sc.setNick(r.getName()); 
     sc.setEmail(r.getUser()); 
     roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all); 
     prs = roster.getPresence(r.getUser()); 
     Presence.Mode presence2 = prs.getMode(); 
     status = ConvierteEnumToString(presence2); 
     sc.setFirstSentence(status); 
     results.add(sc); 


    } 
    return results; 

} 

\* 
    * 
    *\ 
private void ConvierteEnumToString(Presence.Mode pm){ 

    switch(pm){ 
    case available: 
     Log.i(LOGTAG,"Case Available"); 
     status= "Available"; 
     break; 
    case away: 
     Log.i(LOGTAG,"Case away"); 
     status= "Away"; 
     break; 
    case chat: 
     Log.i(LOGTAG,"Case chat"); 
     status= "chat"; 
     break; 
    case dnd: 
     Log.i(LOGTAG,"Case dnd"); 
     status= "Do not disturb"; 
     break; 
    case xa: 
     Log.i(LOGTAG,"Case xa"); 
     status= "Unavailable"; 
        break; 
      default: 
        Log.i(LOGTAG,"Invalid status"); 
        status="Invalid"; 
        break; 

    } 




} 

나는이 라인의 속성을 변경하는 경우 : 문자열 상태 = ConvierteEnumToString (presence2를); 나는 Presence.Mode.available을 직접 두었고 모든 연락처에 사용 가능한 상태를 할당하지만 제대로 작동합니다.

04-10 23:11:02.866: W/dalvikvm(1722): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
04-10 23:11:02.886: E/AndroidRuntime(1722): FATAL EXCEPTION: main 
04-10 23:11:02.886: E/AndroidRuntime(1722): java.lang.NullPointerException 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.chat.Login.GetSearchContacts(Login.java:164) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.chat.Login.access$1(Login.java:153) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.chat.Login$1.onClick(Login.java:81) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.view.View.performClick(View.java:2485) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.view.View$PerformClick.run(View.java:9080) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.os.Handler.handleCallback(Handler.java:587) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.os.Looper.loop(Looper.java:123) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at dalvik.system.NativeStart.main(Native Method) 

가끔 한 사용자 상태를 확인하고 예외가 발생하고 때로는 더 상태가 전혀 없어되어 차이로 :이 같은 예외를 얻을 위는 코드에서와 같이 나는 그것을 할 경우. 도움 주셔서 대단히 감사합니다!

답변

1

문제점을 발견했습니다. 내가 관심을 가질만한 해결책을 여기에 추가한다.

문제는이 광고가 실행될 때이었다

Presence.Mode presence2 prs.getMode =();

가능한 값 중 하나는 presence2가 가져올 수있는 값 중 하나입니다. 그래서 당신은 null 변수를 Presence.Mode 존재 변수를 기다리고 있던 try/catch 구조체에 전달하고 있습니다 ... 그게 왜 NullPointerException이 있는지입니다.

variable2가 null 인 경우 테스트하고 해당되는 경우 변경됩니다. try/catch 구조로 라인을 감싸고 NullPointerException을 어떻게 든 처리한다고 가정합니다.

나는이 문제에 대한 해결책을 생각하는 데 시간을 낭비하지 않도록 누군가에게 도움이되기를 바랍니다.