【发布时间】:2011-11-02 11:10:29
【问题描述】:
我正在尝试在 Android 上实现一个简单的 Facebook 聊天应用程序。它允许用户登录,之后应用会打开一个新的ListActivity 枚举用户的在线联系人,然后在单击一个项目时,另一个Activity 会在他们的对话发生的位置打开。
用户登录的第一个屏幕称为MainActivity。它包含两个EditTexts:一个用于FB用户名,另一个用于密码。还有两个按钮:Clear,清空EditTexts,OK,点击后通过new LoginTask().execute()执行下面的AsyncTask:
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 时,我可以看到我确实有在线联系人。不过,我不明白为什么它有时会返回正确的数字,但几乎每十亿次运行应用程序时只有一次。
有人帮忙吗?这个应用程序将在四个小时后到期,我不知道该怎么办了,因为我的代码似乎没有任何问题。
【问题讨论】:
标签: android smack facebook-chat