Метод post () android.os.Handler вызывается в прикрепленной нити, но есть какое-то странное явление! - PullRequest
0 голосов
/ 04 июня 2011

Как сказал API, метод post () должен вызываться в цепочке, к которой он прикреплен, но происходят некоторые странные вещи, которые я не могу объяснить!

код:

public class ProgressBarActivity extends Activity {
private final static String TAG = "ProgressBarActivity";

private Runnable test = new Runnable(){
    @Override
    public void run() {
        try {
            Thread.sleep(10000);
            Log.i(TAG,"Thread---->"+Thread.currentThread().getId());
            Log.i(TAG,"Thread---->"+Thread.currentThread().getName());
        } catch (InterruptedException e) {}
    }
};
private Handler handler = new Handler(){
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    handler.post(test);
    this.setContentView(R.layout.progress_bar_layout);
    Log.i(TAG,"Activity--->"+Thread.currentThread().getId());
    Log.i(TAG,"Activity--->"+Thread.currentThread().getName());
}   

}

Когда я устанавливаю приложение в эмулятор с помощью eclipse, происходит следующее: сначала печатается текст в методе onCreate (), а через 10 секунд печатается текст в методе run ()! Результат как ниже: кто-то знает почему?

06-04 14: 13: 09.964: INFO / ProgressBarActivity (366): действие ---> 1

06-04 14: 13: 09.964: INFO / ProgressBarActivity (366): активность ---> главная

06-04 14: 13: 20.070: INFO / ProgressBarActivity (366): Тема ----> 1

06-04 14: 13: 20.070: INFO / ProgressBarActivity (366): Тема ----> главная

1 Ответ

1 голос
/ 04 июня 2011

Вы ошибаетесь: документы здесь говорят это:

Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached. 

Это означает, что Runnable будет запущен в главном потоке Activity, но будет поставлен в очередь и запущен ПОСЛЕ того, как поток завершит свою текущую работу. Текущая работа завершает onCreate, поэтому после завершения onCreate поток теперь свободен и обработает Runnable. Вот почему вы видите текст Activity перед текстом Runnable: текущий поток не может просто остановить то, что он делает, и взять Runnable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...