0

Google トーク サービスに接続する Android 用のチャット クライアントを実装しようとしています。サーバーに接続し、連絡先を取得し (ListView に表示)、メッセージが送受信されるリストの連絡先名をクリックすると、新しいアクティビティが開きます。私の問題は、ユーザーのアカウントの連絡先のプレゼンスを取得しようとしていることです。私はこのコードを書きましたが、機能しておらず、その理由を見つけることができません。どんな助けでも大歓迎です。

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;

    }




}

この行の属性を変更すると: String status = 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 つのユーザー ステータスを取得することがあるという違いがありますが、例外が発生し、ステータスがまったく取得されないこともあります。ご助力ありがとうございます!

4

1 に答える 1

1

私は問題を発見しました。ここに解決策を追加します。

問題は、この行が実行されたときです。

プレゼンス.モード プレゼンス2 = prs.getMode();

プレゼンス 2 が取得できる値の 1 つは null です。したがって、Presence.Mode プレゼンス変数を待っていた try/catch 構造に null 変数を渡しています...そのため、NullPointerException が取得されます。

その行の直後にif句を追加しました。これは、変数presents2がnullに等しいかどうかをテストし、それが発生した場合は何らかの形で変更します。行をtry/catch構造で囲み、NullPointerExceptionを何らかの方法で処理することもできると思います。

少なくとも、これに対する解決策を考える時間を無駄にしないために、誰にでも役立つことを願っています!

于 2012-04-11T16:33:14.923 に答える