我正在尝试在 Android 上实现一个简单的 Facebook 聊天应用程序。它允许用户登录,之后应用程序会打开一个ListActivity
枚举用户在线联系人的新项目,然后在单击一个项目时,Activity
会打开另一个项目,他们将在其中进行对话。
调用用户登录的第一个屏幕MainActivity
。它包含两个EditText
s:一个用于 FB 用户名,另一个用于密码。还有两个按钮:清除,清空EditText
s 和确定,单击后通过 执行以下 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 时,我可以看到我这样做了有在线联系。但是,我不明白为什么它有时会返回正确的数字,但几乎每十亿次运行该应用程序时只有一次。
有人帮忙,好吗?这个应用程序将在四个小时后到期,我不知道该怎么做,因为我的代码似乎没有任何问题。