Я пытаюсь реализовать простое приложение чата Facebook на Android.Он позволяет пользователю войти в систему, после чего приложение открывает новый ListActivity
, перечисляющий онлайн-контакты пользователя, и после нажатия на элемент открывается еще один Activity
, где происходит их разговор.
Первый экрангде пользователь входит в систему, называется MainActivity
.Он содержит два EditText
s: один для имени пользователя FB, а другой для пароля.Есть также две кнопки: Очистить, которая очищает EditText
s, и OK, которая при нажатии выполняет следующую AsyncTask через new LoginTask().execute()
:
class LoginTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog loading;
@Override
protected void onPreExecute() {
loading = ProgressDialog.show(MainActivity.this, "", "Loading...");
}
@Override
protected Void doInBackground(Void... params) {
// setup XMPP connection
ConnectionConfiguration config = new ConnectionConfiguration(
"chat.facebook.com", 5222, "chat.facebook.com");
config.setDebuggerEnabled(true);
config.setSASLAuthenticationEnabled(true); // TRUE for fb
conn = new XMPPConnection(config);
try {
// attempt login
conn.connect();
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
conn.login(login_field.getText().toString(),
pwd_field.getText().toString(), "");
Log.d("TRACE", "isAuthenticated? " + conn.isAuthenticated());
// list online contacts
Roster roster = conn.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
Log.d("TRACE", "entries.size()=" + entries.size());
for (RosterEntry e : entries) {
Log.d("PRESENCE", e.getUser() + "=" + roster.getPresence(e.getUser()).isAvailable());
if (roster.getPresence(e.getUser()).isAvailable()) {
HashMap<String, String> contact = new HashMap<String, String>();
contact.put(NAME_KEY, e.getName());
contact.put(USERJID_KEY, e.getUser());
Log.d("ADD", "NAME_KEY=" + e.getName() + " USERJID_KEY=" + e.getUser());
contacts.add(contact);
}
}
Collections.sort(contacts, new ContactComparator()); // sort alphabetically
Log.d("TRACE", "MainActivity.contacts.size(): " + contacts.size());
Intent in = new Intent(MainActivity.this, ContactList.class);
startActivity(in);
} catch (Exception e) {
Log.d("EXCEPTION", e.toString());
}
return null;
}
@Override
protected void onPostExecute(Void result) {
loading.dismiss();
}
}
Моя проблема в том, что всякий раз, когда второй экранпри открытии ListView часто ничего не показывает, НО ЭТО ИНОГДА ДЕЛАЕТ .Я решил добавить сообщения журнала в ту часть, где я получаю контакты с помощью conn.getRoster()
, и обнаружил, что в большинстве случаев звонок на conn.getRoster().getEntries.size()
возвращает ноль, но когда я действительно захожу в Facebook через браузер,Я вижу, что у меня есть онлайн-контакты.Однако я не понимаю, почему он иногда возвращает правильное число, но только один раз почти каждый миллиард раз я запускаю приложение.
Кто-нибудь поможет, пожалуйста?Это приложение выйдет через четыре часа, и я больше не знаю, что делать, так как в моем коде нет ничего плохого.