Hitmanpt Posted May 7, 2013 at 06:09 PM Report #506142 Posted May 7, 2013 at 06:09 PM Boas pessoal. O meu problema é o seguinte, eu estou a criar uma app para android usando o monodroid que permite usar o C# para programar para android, e nessa app tenho uma app que usa um cronometro e tenho o seguinte código using System; using System.Timers; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using System.Diagnostics; namespace ReceCounter { [Activity(Label = "ReceCounter", MainLauncher = true, Icon = "@drawable/icon")] public class Activity1 : Activity { int count = 1; private Timer chrono; private Boolean running = false; TextView chrono_txt; private Stopwatch sw; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); chrono = new Timer(); chrono.Interval = 1; this.chrono.Elapsed += new ElapsedEventHandler(chrono_Tick); chrono_txt = FindViewById<TextView>(Resource.Id.chronoview); chrono_txt.Click += delegate { if(running == false) { chrono.Start(); running = true; sw = new Stopwatch(); sw.Start(); } else if(running == true) { chrono.Stop(); running = false; sw.Stop(); } }; } void chrono_Tick(object source, ElapsedEventArgs e) { RunOnUiThread(delegate { int h = sw.Elapsed.Hours, m = sw.Elapsed.Minutes, s = sw.Elapsed.Seconds, ms = sw.Elapsed.Milliseconds; chrono_txt.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:000}", h,m,s,ms); }); } } } Mas testei só isto no Galaxy S3 e passado 2/3 segundos começa a lagar... alguma ideia? Penso que será algum problema de optimização de código...
kalin Posted May 7, 2013 at 07:37 PM Report #506155 Posted May 7, 2013 at 07:37 PM Podes clarificar melhor o que queres dizer com isto? ... e passado 2/3 segundos começa a lagar... A única optimização que eu faria seria a criação do StopWatch, onde tens: sw = new Stopwatch(); sw.Start(); eu substituia por: sw.Restart(); com o StopWatch inicializado no OnCreate. Isto é uma pequena optimização que não deverá trazer grandes alterações de performance.
Hitmanpt Posted May 7, 2013 at 08:09 PM Author Report #506157 Posted May 7, 2013 at 08:09 PM Podes clarificar melhor o que queres dizer com isto? Quero dizer que os números não aparecem fluidamente como nos cronómetros que se vêm na app store... mas sim saltiados +/- de 150 a 500ms
kalin Posted May 8, 2013 at 01:13 AM Report #506204 Posted May 8, 2013 at 01:13 AM Já tentas-te usar este widget: http://developer.android.com/reference/android/widget/Chronometer.html
miattorocha Posted May 13, 2013 at 04:58 PM Report #507187 Posted May 13, 2013 at 04:58 PM Já resolveu seu problema? Se não, tive duas idéias a qual você pode investigar: No trecho do delegate do chrono_txt.Click se running é um boolean e você tem o if(running == false) você não precisa de um else IF só o ELSE resolve. (otimização). RunOnUiThread tenta ver os valores separadamente antes de juntar no String.Format para ver se acontece a mesma coisa. Espero ter ajudado.
kalin Posted May 13, 2013 at 08:51 PM Report #507202 Posted May 13, 2013 at 08:51 PM Não concordo com a optimização apresentada: alterar if(runing == false) para if(!frunning) não é uma optimização, já que o que é executado, e o que o compilador cria, é exactamente o mesmo. Quanto mais, o código fica menor, mas também poderá ficar mais ilegível. Na minha experiência o que mais faz pendurar os programas, é a criação de objectos, o lançamento de excepções e a comunicação entre threads, podendo estar aqui o problema do nosso colega, dai a minha sugestão de utilização de um widget já existente.
bioshock Posted May 21, 2013 at 11:54 AM Report #508197 Posted May 21, 2013 at 11:54 AM O teu booleano 'running' é para verificar se o StopWatch() está a correr? Se sim, porque não utilizas simplesmente a função do StopWatch() que te permite saber isso? if (watch.IsRunning) { } Além do mais, podes inicializar logo um novo StopWatch() aquando o Load(). Portanto em vez de: Private Stopwatch sw; Terás: Private Stopwatch sw = new Stopwatch(); De resto, não precisas de parar os cronómetros/relógios se estes não estiverem a trabalhar, pelo que apenas precisas de: if (!watch.IsRunning) { // código }
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now