Jump to content

Recommended Posts

Posted

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...

Posted

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.

Posted

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

Posted

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.

Posted

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.

Posted

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 }

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.