2016-05-30 17 views
1

In der Anwendung, die ich entwickle, muss ich einen Timer zwischen Aktivitäten ausführen, um die Dauer eines OAuth-Tokens zu verfolgen. Zu diesem Zweck habe ich einen Service implementiert.Xamarin Android Hintergrund-Timer-Dienst

Hier ist der Service-Code:

[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); 
    } 
} 

Meine Frage zu dieser ist, wie kann ich die Informationen in einer Aktivität erhalten, wenn das Token aktualisiert werden muss, damit ich das Ansichtsmodell aktualisieren. Gibt es eine bessere Möglichkeit, dieses Problem anzugehen? Bitte beachten Sie, dass ich ein wenig Anfänger in der Android-Entwicklung bin. Vielen Dank im Voraus.

Antwort

2

Ich würde für Messaging mit dem Messenger-Plugin gehen. https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger

Erstellen Sie eine spezielle Nachricht

public class TokenRefreshedMessage 
    : MvxMessage 
{ 
    public TokenRefreshedMessage(object sender) 
     : base(sender) 
    { 
    } 
} 

Veröffentlichen Sie die Nachricht in der Service-

Mvx.Resolve<IMvxMessenger>().Publish(new TokenRefreshedMessage(this)); 

auf die Nachricht abonnieren

public class MyViewModel : MvxViewModel 
{ 
    private readonly MvxSubscriptionToken _token; 

    public LocationViewModel(IMvxMessenger messenger) 
    { 
     _token = messenger.Subscribe<TokenRefreshedMessage>(OnTokenRefreshed); 
    } 

    private void OnTokenRefreshed(TokenRefreshedMessage locationMessage) 
    { 
     // update properties 
    } 
} 
+0

Danke, schau es dir später an :) –