При вызове Looper.loop () не отображается кнопка

может кто-нибудь объяснить, почему отображается кнопка.

xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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=".MainActivity" >


<Button 
android:layout_below="@+id/tt"
android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Simple Button"/>

</RelativeLayout>

Основная деятельность

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
             Toast.makeText(getApplicationContext(), "onCreate", Toast.LENGTH_SHORT).show();    
        }
    }, 10000);

    // Looper.loop();
}

}

Для вышеприведенного кода вывод

введите описание изображения здесь

Для вывода кода выше (когда я раскомментирую Looper.loop ()) введите описание изображения здесь

Кто-нибудь может это объяснить. Что делает Looper.loop (), чтобы кнопка не отображалась в пользовательском интерфейсе. Я знаю, что Looper - это то, что я использую, это основные потоки пользовательского интерфейса Looper.

Я знаю, что Looper уже запущен (перебирает сообщения), и я вызываю Looper.loop (); Я просто хочу знать, что это означает, что рисование кнопки не происходит в потоке пользовательского интерфейса, означает, что Looper сбрасывается или удаляет какое-то сообщение. что именно происходит, когда мы вызываем Looper.loop () в цикле потока, когда он уже зациклен.


person Sush    schedule 13.04.2014    source источник


Ответы (1)


Looper.loop(); - это бесконечный цикл, поэтому, когда вы запускаете его из основного потока пользовательского интерфейса, выполнение кода в основном останавливается на этом, предотвращая отображение пользовательского интерфейса.

Не уверен, чего вы пытаетесь достичь, и я совсем не знаком с Looper и потоками, но вот несколько статей о Looper, которые я прочитал.

http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/ http://corner.squareup.com/2013/10/android-main-thread-1.html

person singularhum    schedule 14.04.2014
comment
Ваш пост очень относится к ответу, но не полностью. Я знаю, что Looper уже запущен (перебирает сообщения), и я вызываю Looper.loop (); Я просто хочу знать, что это означает, что рисование кнопки не происходит в потоке пользовательского интерфейса, означает, что Looper сбрасывается или удаляет какое-то сообщение. что именно происходит, когда мы вызываем Looper.loop () в цикле потока, когда он уже зациклен. - person Sush; 14.04.2014
comment
@sush, потому что когда вы вызываете Looper.loop, вы блокируете остальную часть кода. Другими словами, вы блокируете продолжение основного потока. Он никогда не доберется до onStart и onResume активности, потому что сделанный вами вызов Looper.loop ожидает сообщений. Причина, по которой вы получаете сообщение Toast, заключается в том, что вы создали сообщение для отображения Toast, затем вы вызвали Looper.loop, и теперь все, что он делает, это ждет и заберет ваш Toast для отображения через 10 секунд, а затем продолжает ждать. - person singularhum; 15.04.2014
comment
@sush, поэтому один из способов визуализировать это - добавить переопределение onResume в свою деятельность и поместить в него точку останова отладки. Когда вы отлаживаете свое приложение, вы никогда не попадете в onResume, поскольку выполнение кода все еще находится в вашей строке Looper.loop. - person singularhum; 15.04.2014