Урок 85. Еще несколько способов выполнения кода в UI-потоке


В этом уроке:

- рассмотрим еще пару способов запуска Runnbale в UI-потоке

Мы подробно рассмотрели Handler и увидели, что он умеет. Главное его достоинство – это умение выполнять код в UI-потоке. Существует еще пара способов выполнять Runnable в UI-потоке. Это методы:

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

Первые два похожи и отправляют Runnable на немедленную обработку. Я не знаю в чем их принципиальное отличие. Если у вас есть соображения на этот счет, пишите на форуме в ветке этого урока. А третий метод позволяет указать задержку выполнения Runnable.

Создадим приложение и опробуем эти методы.


Создадим проект:

Project name: P0851_RunnableUIThread
Build Target: Android 2.3.3
Application name: RunnableUIThread
Package name: ru.startandroid.develop.p0851runnableuithread
Create Activity: MainActivity


main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llMain"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="">
</TextView>
</LinearLayout>

TextView, которое будем обновлять из нового потока.


MainActivity.java:


package ru.startandroid.develop.p0851runnableuithread;

import java.util.concurrent.TimeUnit;

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

public class MainActivity extends Activity {

 
final String LOG_TAG = "myLogs";

  TextView tvInfo;

 
/** Called when the activity is first created. */
 
public void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView
(R.layout.main);

    tvInfo =
(TextView) findViewById(R.id.tvInfo);

    Thread t =
new Thread(new Runnable() {
     
public void run() {
       
try {
         
TimeUnit.SECONDS.sleep(2);
          runOnUiThread
(runn1);
          TimeUnit.SECONDS.sleep
(1);
          tvInfo.postDelayed
(runn3, 2000);
          tvInfo.post
(runn2);
       
} catch (InterruptedException e) {
         
e.printStackTrace();
       
}
      }
    })
;
    t.start
();
 
}

 
Runnable runn1 = new Runnable() {
   
public void run() {
     
tvInfo.setText("runn1");
   
}
  }
;

  Runnable runn2 =
new Runnable() {
   
public void run() {
     
tvInfo.setText("runn2");
   
}
  }
;

  Runnable runn3 =
new Runnable() {
   
public void run() {
     
tvInfo.setText("runn3");
   
}
  }
;
}



В onCreate создаем новый поток. В нем мы через паузы выполняем runn1 и runn2, и планируем runn3 с задержкой в 2000 мсек, используя вышеупомянутые методы. 

runn1, runn2 и runn3 – это просто Runnable, которые обновляют текст в TextView. Они должны быть выполнены в UI-потоке.


Все сохраним и запустим. Экран пустой.

Через 2 сек выполняется runn1

Еще через секунду runn2

И еще через 2 секунды срабатывает runn3, который был отложен на 2 сек.


Тем самым, если ваши алгоритмы не особо сложны, можно использовать эти методы для выполнения кода в UI-потоке. Если же нужны навороты и алгоритм достаточно сложен, то используем Handler.


На следующем уроке:

- создаем несложный пример с AsyncTask