Threads (Runnable dentro de Runnable) --> Dúvidas

3 respostas
A

Tenho uma dúvida básica relacionada às interfaces Runnable em um exemplo de aprendizagem de um livro que estou lendo(Para iniciantes no desenvolvimento de aplicativos móveis). Eis o código:

progress = 0;
		progressBar = (ProgressBar) findViewById(R.id.progressbar);
		
		new Thread(new Runnable(){
			public void run(){
				while (progressStatus < 10){
					progressStatus = doSomeWork();
				}
				handler.post(new Runnable(){  //Aqui me sinto confuso, pois estamos iniciando e implementando duas instâncias de Runnable
					public void run(){
						//--0 - visível; 4 - invisível; 8 - FINDO--
						progressBar.setVisibility(8);
					}
				});
			}
			private int doSomeWork(){
				try {
					Thread.sleep(500);
				} catch (InterruptedException e){
					e.printStackTrace();
				}
				return ++progress;
			}
		}).start();

A minha dúvida está em qual dos métodos run() vai funcionar, e como irão funcionar!
Se alguem puder me ajudar, ficaria muito grato. Agradeço desde já.

3 Respostas

B

Aquilla

o .start é quem executa uma Thread e nesse caso está sendo inicia a primera Thread/Runnable.

O segundo Runnable, é um objeto sendo colocado no objeto handler. Que é uma fila de mensagens pelo que li na api do android

http://developer.android.com/reference/android/os/Handler.html

Essa segunda Runnable, é uma thread que será iniciada pelo próprio android em background, quando for necessário.

M

O metodo start() da linha 24 vai incializar o metodo run() da linha 5, porém arédito que não precisa fazer uma segunda thread só para atualizar o seu progressBar, lembrando que seu processo já está em uma thread e essa segunda thread será inicializada somente quanto sair do while. Acredito que poderia resolver assim.

progress = 0;
		progressBar = (ProgressBar) findViewById(R.id.progressbar);
		
		new Thread(new Runnable(){
			public void run(){
				while (progressStatus &lt; 10){
					progressStatus = doSomeWork();
				}
				progressBar.setVisibility(8);
			}
			private int doSomeWork(){
				try {
					Thread.sleep(500);
				} catch (InterruptedException e){
					e.printStackTrace();
				}
				return ++progress;
			}
		}).start();
A

Obrigado pela atenção e me desculpe por qualquer incomodo. Realmente eu deveria ter lido a API(mesmo sendo leigo em inglês, o que me desencoraja bastante! )…

Criado 13 de março de 2013
Ultima resposta 13 de mar. de 2013
Respostas 3
Participantes 3