Vlákna

Vlákna umožňujú urýchliť reakciu používateľského rozhrania. Všetky operácie, ktoré vykonáva používateľské rozhranie Androidu sa ukladá do zásobníka činností. Tento zásobník riadi jedno hlavné vlákno aplikácie. Toto vlákno sa používa tiež pre spätné volania aktivity (onCreate(), onClick(), atď.). Pokiaľ sa jedna činnosť neskončí, nezačne druhá – pozastaví sa aktualizácia obrazovky (nič nové sa nezobrazí). V prípade, že sme mu prikázali nejakú časovo náročnú činnosť, tak systém môže zobraziť správu – „aplikácia nereaguju“. Pre takéto operácie, by sme mali vytvoriť ďalšie vlákno, ktoré bude spustené na pozadí.

Na zobrazovanie ukazovania priebehu vykonávania nejakej činnosti môžeme použiť widget ProgressBar. Priebeh reprezentujú celé čísla, ktoré začínajú hodnotou 0 a maximálna hodnota je 100 (môžeme ju meniť).

MainActivity.java

public class MainActivity extends AppCompatActivity {

ProgressBar bar;

//pre každú aktivitu potrebujeme jednen objekt typu Handler
//tento objekt vykoná všetky operácie vo vlákne
Handler handler = new Handler() {

    //komunikovať môžeme pomocou správ a objektov typu Runnable
    //aby objekt Handler mohol spracovávať správy musí implementovať metódu handleMessage(), ktorá sa volá vždy pre každú správu

        @Override

        public void handleMessage(Message msg) {

            //o koľko sa bude zvyšovať hodnota progressbaru pri akejkoľvek správe
            bar.incrementProgressBy(10);

            //ak je hodnota rovná 100, tak spusti toast, maximálna hodnota vlákna je 100, hodnota sa môže meniť
            if (bar.getProgress() == 100) {

               Toast.makeText(getApplicationContext(),"Načítavanie dokončené",Toast.LENGTH_LONG).show();
            }
        }
    };
    AtomicBoolean isRunning = new AtomicBoolean(false);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bar = (ProgressBar) findViewById(R.id.progressBar);
    }
    //onStart() - vlákno, ktoré pobeží v pozadí
    @Override

    protected void onStart() {
        super.onStart();

        //metóda setProgess() nastavuje od akej hodnoty začneme
        bar.setProgress(0);

        Thread background = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 10 && isRunning.get(); i++) {

                        //vlákno zaspí na pol sekundy a následne pošle správu
                        Thread.sleep(500);

                        /*sendMessage() - okamžite vloží správu do zásobníka
                        obtainMessage() - na získanie objektu Message(), ktoré potrebujeme na zasielanie správ */
                        handler.sendMessage(handler.obtainMessage());

                        }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        isRunning.set(true);
        background.start();
    }
    @Override
    protected void onStop() {
        super.onStop();
        isRunning.set(false);
    }
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="p_v.vlakna.MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Načítava"
        android:layout_centerInParent="true"/>

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_below="@id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>


Zdrojový kód príkladu.