Można używać z tej próbki:
W poniższym przykładzie mamy zamiar korzystać z tego do publicznej wiadomości wyniki z wyszukiwania synonimów, który został przetworzony przez wątek tła.
Aby osiągnąć cel podczas wywołania działania OnCreate, skonfigurujemy onClickListener, aby uruchomić właściwość searchTask w utworzonym wątku.
Gdy użytkownik kliknie na przycisk Szukaj, będziemy tworzyć Runnable anonimowy klasę, która wyszukuje słowa wpisane w R.id.wordEt EditText i rozpoczyna wątek wykonać Runnable.
Po zakończeniu wyszukiwania utworzymy wystąpienie Runnable SetSynonymResult , aby opublikować wynik w synonimie TextView przez wątek interfejsu użytkownika.
Ta technika jest czasami nienajlepsza, szczególnie, gdy nie mamy dostępu do instancji Activity; dlatego w kolejnych rozdziałach omówimy prostsze i bardziej przejrzyste techniki aktualizowania interfejsu użytkownika z zadania obliczeniowego w tle .
public class MainActivity extends AppCompatActivity {
class SetSynonymResult implements Runnable {
String synonym;
SetSynonymResult(String synonym) {
this.synonym = synonym;
}
public void run() {
Log.d("AsyncAndroid", String.format("Sending synonym result %s on %d",
synonym, Thread.currentThread().getId()) + " !");
TextView tv = (TextView) findViewById(R.id.synonymTv);
tv.setText(this.synonym);
}
}
;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button search = (Button) findViewById(R.id.searchBut);
final EditText word = (EditText) findViewById(R.id.wordEt);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Runnable searchTask = new Runnable() {
@Override
public void run() {
String result = searchSynomim(word.getText().toString());
Log.d("AsyncAndroid", String.format("Searching for synonym for %s on %s",
word.getText(), Thread.currentThread().getName()));
runOnUiThread(new SetSynonymResult(result));
}
};
Thread thread = new Thread(searchTask);
thread.start();
}
});
}
static int i = 0;
String searchSynomim(String word) {
return ++i % 2 == 0 ? "fake" : "mock";
}
}
Źródło:
asynchronous android programming Helder Vasconcelos
Czy to nie było śmieci zebrane prawie natychmiast? Prawdopodobnie musisz zachować pewne odniesienie do wątku() – Nick
@Nick: śmieciarz obserwuje również stos, tj. Gdy wątek jest uruchomiony, nie otrzyma GC. –
@Vipul, miałem pytanie dotyczące rotacji telefonu: chcę, aby raz obracałem telefon, aby ten wątek działał i nie został utworzony nowy wątek. Czy możesz podać wskazówki, jak zapobiec tworzeniu nowego wątku po obróceniu telefonu? – user1836957