Vlákna
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.