MójDroid.pl

#14 Twórz aplikacje na Androida z Mojdroid.pl – Thread (część pierwsza)

2012-09-29
|
Damian P.

Uruchomienie każdej nowej aplikacji od strony Androida to tak naprawdę stworzenie nowego wątku, czyli procesu który utrzymuje działanie całej aplikacji. Jest to normalne i nikogo dziwić nie powinno, bo podobnie odbywa się to również w innych systemach. Czasami jednak jeden proces na aplikację to zdecydowanie zbyt mało - jeżeli dokonujemy w programie skomplikowanych obliczeń lub zadań, to często zauważymy przycięcia, zamrożenia a nawet próbę zamknięcia programu przez system. Aby temu zapobiec uruchamiamy drugi wątek w aplikacji, który wymagające zadania weźmie na siebie, zostawiając główny proces możliwy do działania.
Informacja: Nie radzisz sobie z kodem? Coś Ci nie wychodzi lub nie działa? Zgubiłeś się? W tym miejscu zobaczysz pełen kod aplikacji, a tutaj go pobierzesz na dysk.
Zanim jednak zacznę objaśniać jak stworzyć nowy proces, muszę was poinformować o wadach takiego rozwiązania. Jeżeli myślicie, że kilka procesów rozwiąże wasze problemy z płynnością programu, to się mylicie. Tworzenie Threadów jest bardzo baterio-chłonne, więc nawet przy dwóch działających na raz, czas działania na akumulatorze drastycznie spada. Zaletą natomiast Theadów jest to, że potrafią one szybko się zamknąć po wykonaniu swojego zadania. Jeżeli więc obsługujemy w naszym wątku bardzo krótkie zadania, to nic złego nie powinno się stać na krótką metę. Powinno, nie znaczy że tak będzie za każdym razem, rzecz jasna. PS. Thread jest asynchroniczny! Wyniki będą pojawiać się od razu wtedy, kiedy będą dostępne! Nie polegajcie na czasie wykonania zadania!

1. Thread

Jak to każdy proces, tak i ten w Androidzie może mieć własne funkcje, zmienne czy kolejkę do wykonania. Każdy nowy stworzony przez nas proces nie może być tym głównym, jedynie dodatkowym. Nowy wątek możemy uruchomić na dwa sposoby:
  • Poprzez stworzenie nowej klasy, która będzie rozszerzała Thread
  • lub przez utworzenie nowej instancji z zaimplementowanym runnable wewnątrz jej.
PS. Thread posiada ustawienie, które wyznacza priorytet na wykorzystywanie możliwości CPU, poprzez wykorzystanie funkcji setPriority().

2. Tworzenie nowego Threadu

Przejdźmy do stworzenia nowego wątku. Będzie on bardzo prosty i nie będzie wykonywał skomplikowanych zadań, ot po prostu zmieni nam tekst w naszym TextView. Stwórzmy nową klasę oraz szablon z jednym textView. View_Thread:
package com.example.moja.pierwsza.aplikacja;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class View_Thread extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	setContentView(R.layout.view_thread);

	TextView tv1 = (TextView) findViewById(R.id.tV_thread);

    }

}
Czas na stworzenie nowego wątku. Stworzymy go drugim sposobem, czyli od razu w naszej klasie View_Thread. Nie jest to zbyt trudne i wygląda to tak:
package com.example.moja.pierwsza.aplikacja;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class View_Thread extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	setContentView(R.layout.view_thread);

	final TextView tv1 = (TextView) findViewById(R.id.tV_thread);

	new Thread(new Runnable() {
	    public void run() {
		tv1.setText("Thread został uruchomiony!");
	    }
	}).start();

    }

}
Jak wcześniej wspominałem, nowy Thread musi zawierać w sobie (implementować) nowe Runnable (kod do wykonania). Dodatkowo jeżeli chcemy operować na innych elementach dostępnych w klasie, musimy je zdefiniować tak, aby w trakcie wykonywania kodu w wątku te nie mogły się zmienić (to znaczy dostęp do nich). W tym wypadku nasz textView oznaczamy jako finalny, przez co niemożliwym staje się jego zamiana (nie ustawianie tekstu, po prostu nie możemy ustalić innego textview pod tV1).