在我正在开发的应用程序中,我需要在活动之间运行一个计时器来跟踪OAuth令牌的持续时间。为此,我实施了一项服务。
这是服务代码:
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
// Gets the token duration in seconds
tokenDuration = Convert.ToInt32(intent.GetStringExtra("tokenDuration"));
tokenStart = Convert.ToDateTime(intent.GetStringExtra("tokenStart"));
tokenEnd = Convert.ToDateTime(tokenStart.AddSeconds(tokenDuration));
t = new Thread(() =>
{
timer = new Timer(tokenDuration);
timer.Interval = 60000;
timer.Elapsed += OnTimedEvent;
timer.Enabled = true;
});
t.Start();
return StartCommandResult.Sticky;
//return base.OnStartCommand(intent, flags, startId);
}
private void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs e)
{
timeElapsed++;
System.Diagnostics.Debug.WriteLine("Minute elapsed, Total Token duration {0}s, Total time elapsed {1}min", tokenDuration, timeElapsed);
if (tokenEnd.Add(new TimeSpan(0, -3, 1)) == tokenStart.AddMinutes(timeElapsed))
{
timer.Stop();
Intent intent = new Intent();
intent.SetAction(action);
intent.PutExtra("AskRefreshToken", true);
SendBroadcast(intent);
}
}
我的问题是如何在令牌需要更新时获取活动中的信息,以便我可以更新视图模型。 有没有更好的方法来解决这个问题? 请注意,我在Android开发中有点像初学者。 提前谢谢。
答案 0 :(得分:2)
我要使用messenger插件进行消息传递。 https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger
制作特殊消息
public class TokenRefreshedMessage
: MvxMessage
{
public TokenRefreshedMessage(object sender)
: base(sender)
{
}
}
在您的服务中发布消息
Mvx.Resolve<IMvxMessenger>().Publish(new TokenRefreshedMessage(this));
订阅讯息
public class MyViewModel : MvxViewModel
{
private readonly MvxSubscriptionToken _token;
public LocationViewModel(IMvxMessenger messenger)
{
_token = messenger.Subscribe<TokenRefreshedMessage>(OnTokenRefreshed);
}
private void OnTokenRefreshed(TokenRefreshedMessage locationMessage)
{
// update properties
}
}