Android
Wątek
Szukaj…
Przykład wątku z jego opisem
Podczas uruchamiania aplikacji najpierw wykonywany jest główny wątek. Ten wątek główny obsługuje całą koncepcję aplikacji interfejsu użytkownika. Jeśli chcemy długo wykonywać zadanie, w którym nie potrzebujemy interfejsu użytkownika, używamy wątku do uruchamiania tego zadania w tle.
Oto przykład wątku opisującego cios:
new Thread(new Runnable() {
public void run() {
for(int i = 1; i < 5;i++) {
System.out.println(i);
}
}
}).start();
Możemy utworzyć wątek, tworząc obiekt Thread, który ma metodę Thread.run()
do uruchomienia wątku. Tutaj metoda run()
jest wywoływana przez metodę start()
.
Możemy także uruchomić wiele wątków niezależnie, co jest znane jako MultiThreading. Wątek ten ma również funkcję uśpienia, dzięki której aktualnie wykonywany wątek przechodzi w stan uśpienia (czasowo wstrzymuje wykonywanie) na określony czas. Ale sen rzuca wyjątek InterruptedException Tak więc musimy sobie z tym poradzić, używając try / catch w ten sposób.
try{Thread.sleep(500);}catch(InterruptedException e){System.out.println(e);}
Aktualizowanie interfejsu użytkownika z wątku w tle
Często używa się wątku w tle do wykonywania operacji sieciowych lub długotrwałych zadań, a następnie w razie potrzeby aktualizuje interfejs użytkownika o wyniki.
Jest to problem, ponieważ tylko główny wątek może aktualizować interfejs użytkownika.
Rozwiązaniem jest użycie metody runOnUiThread()
, ponieważ pozwala ona zainicjować wykonanie kodu w wątku interfejsu użytkownika z wątku w tle.
W tym prostym przykładzie Wątek jest uruchamiany po utworzeniu działania, działa do momentu losowego wygenerowania magicznej liczby 42
, a następnie używa metody runOnUiThread()
do aktualizacji interfejsu użytkownika po spełnieniu tego warunku.
public class MainActivity extends AppCompatActivity {
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.my_text_view);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
//do stuff....
Random r = new Random();
if (r.nextInt(100) == 42) {
break;
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText("Ready Player One");
}
});
}
}).start();
}
}