リモート サーバーと通信するバックグラウンド サービスを実行するアプリケーションを作成しています。サーバーから新しいメッセージが送信されたら、UI で表されるオブジェクトを更新し、UI ビューを更新してオブジェクトの新しい状態を表す必要があります (たとえば、オブジェクトの background プロパティが true の場合 - 背景を設定します)。ビューの背景を緑に設定し、false の場合はビューの背景を赤に設定します)。
リスト ビューを使用して、ArrayAdapter をスローするすべてのオブジェクトのすべての ArrayList を表示しています。
静的参照用の Application オブジェクト (app という名前) があり、現在実行中のアクティビティを格納する CurrentActivity プロパティがあります (UI が閉じている場合は null)。
私はこのコードを使用してUIを更新しています:
私のサービスで:
onNewMessage(boolean backgruond)
{
if (app.getCurrentActivity != null)
app.getCurrentActivity.onNewMessage(background);
}
私の活動で:
onNewMessage(boolean background)
{
object.setBackground(bacground);
Log.d("Background", String.valueof(background));
runOnUiThread(new Runnable() {
@Override
public void run()
{
arrayAdapter.notifyDataSetChanged();
}
});
}
ログは正しいバックグラウンド状態を返しますが、ビューは notifyDataSetChanged() で更新されません。
Activity throw BroadcastRecevier にメッセージを送信しようとしましたが、サーバーから大量のメッセージが送信され、多くの受信者を登録する必要があるため、はるかに複雑です。さらに、なぜレシーバーが機能し、このメカニズムが機能しないのか理解できません..
ListView を更新する作業メソッドの例:
ListViewActivity - BaseActivity からの継承:
@Override
public void onUnFriend(FacebookUser facebookUser, boolean isYouRemovedClient)
{
super.onUnFriend(facebookUser, isYouRemovedClient);
updateView();
}
BaseActivity (Activity を拡張するスーパークラス):
public void onUnFriend(FacebookUser facebookUser, boolean isYouRemovedClient)
{
facebookUser.setApplicationFriend(false);
app.getApplicationFriends().remove(facebookUser);
app.getDatabaseManager().deleteApplicationFriend(facebookUser.getId());
if (isYouRemovedClient)
app.showToast(facebookUser.getName() + " has removed from your friends", true);
else
app.showToast(facebookUser.getName() + " has removed you from friends", true);
}
これは機能し、ListView の背景色を変更します。
ListViewActivity の例が機能しない:
@Override
public void onFriendRequestAccepted(FacebookUser facebookUser, boolean showDialog) {
super.onFriendRequestAccepted(facebookUser, showDialog);
updateView();
}
ベースアクティビティ:
public void onFriendRequestAccepted(FacebookUser facebookUser, boolean showDialog)
{
facebookUser.setApplicationFriend(true);
app.getApplicationFriends().add(facebookUser);
app.getDatabaseManager().addApplicationFriend(facebookUser);
if (showDialog)
app.showNewEventActivity(facebookUser, EventDialogManager.EVENT_FRIEND_ACCEPTED);
}
更新されていません...理由がよくわかりません..