我試圖在Android上實現一個簡單的Facebook聊天應用程序。它允許用戶登錄,之後應用程序將打開一個新的ListActivity
枚舉用戶的在線聯繫人,並且一旦點擊一個項目,另一個Activity
將打開他們的對話發生的地方。Android的Facebook聊天應用程序中的Smack問題:Connection.getRoster()。getEntries()始終爲空
用戶登錄的第一個屏幕稱爲MainActivity
。它包含兩個EditText
s:一個用於FB用戶名,另一個用於密碼。還有兩個按鈕:清除,其清空EditText
秒,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,當我寫這個答案。很確定你可以通過'AsyncTask'做延遲加載。 –