[Java+Android] Wielowątkowość a interfejs użytkownika


(Kamiljano) #1

Tak wygląda mój wątek:

public class TacticalOverviewFiller extends Thread{


	TextView host,host_p,host_u,service,service_p,service_u;

	ConnectionManager cm;


	int interval=30000;


	public TacticalOverviewFiller(TextView host,TextView host_p, TextView host_u, TextView service, TextView service_p, TextView service_u, ConnectionData cd)

	{

		super();

		this.host=host;

		this.host_p=host_p;

		this.host_u=host_u;

		this.service=service;

		this.service_p=service_p;

		this.service_u=service_u;

		try

		{

		this.cm=new ConnectionManager(cd);

		}

		catch (Exception e){}

	}


	public void setMSecInterval(int i)

	{

		interval=i;

	}


	public void setSecInterval(int i)

	{

		interval=i*1000;

	}


	@Override public void run()

	{

		String page;

		//while (true)

		{

			try

			{

				cm.reload();

			}

			catch(Exception e)

			{

				//continue;

			}


			page=cm.getPageContent();

			host.setText(PageParser.findCountHosts(page));

			try{

				sleep(interval);

			}

			catch (Exception e){}

		}

	}

}

Początkowo chciałem go odpalać przy pomocy metody Thread.start(), ale szybko doszedłem do wniosku, że linijka w której pojawia się host.setTest("string") powoduje zwias aplikacji. Znalazłem więc informację, że wypadałoby użyć Action.runOnUiThread(Thread); ale niestety takie rozwiązanie działa niewiele lepiej... Mój Action co prawda się włącza, ale trochę czasu mu to jednak zajmuje, a sam TextView w którym chcę zmieniać tekst nigdy się nie pojawia (tzn. teoretycznie tam jest, ale nie ma w nim żadnego tekstu). Cóż więc robię źle?


(Fiołek) #2

Wypadałoby użyć metody View.post albo Handlera bezpośrednio, bo to one od tego są(runOnUiThread osiągnie się niby to samo, ale semantycznie rzecz biorąc, to Handlery są od tego, odsyłam do StackOverflow). Więc wątek należy odpalić(UI nie wolno blokować na dłużej niż 5s.(taka bezpieczna wartość, przeważnie jest to trochę więcej), bo aplikacja "nie będzie odpowiadać"), a tekst w TextView zmieniać za pomocą post.