рабочий поток Android и пользовательский интерфейс - PullRequest
0 голосов
/ 25 июля 2011
onCreate(Bundle savedInstanceState){
    // show dialog A if something is not correct
    new Thread(){
         public void run(){
               if(something is wrong) {
                   runOnUIThread(new Runnable(){
                       public void run(){
                           showDialog(A);
                       }
                   });
               }
         }
    }.start();
    // show dialog B
    showDialog(B);
}

Я хочу знать

  1. какой диалог будет показан первым, и порядок не определен? Зачем?
  2. Если порядок неопределенный, как я могу воспроизвести случай, когда A показывается перед B?

Спасибо!

Ответы [ 4 ]

1 голос
/ 25 июля 2011
  1. Я не думаю, что возможно, что A показывается перед B ... это потому, что runOnUIThread добавляет событие в конец очереди событий.Код в этом событии (показывающий диалог A) не будет выполняться до тех пор, пока не завершится onCreate () (что означает, что диалог B будет показан первым).

Что не может быть гарантировано, так это порядокмежду показом диалога B и вызовом runOnUIThread, но это не имеет значения.Вот фрагмент из официальных документов:

[runOnUIThread] Runs the specified action on the UI thread. If the current thread is the UI thread, then the action is executed immediately. If the current thread is not the UI thread, the action is posted to the event queue of the UI thread.

  1. N / A
1 голос
/ 25 июля 2011

Ваш вопрос о том, какой диалог будет отображаться первым, является неопределенным. Бывают случаи, когда ордер переходит на флоп. Но обычно B показывалось бы первым, так как 9/10 он поместит свое событие в поток пользовательского интерфейса, прежде чем ваш поток сможет обнаружить проблему.

Я бы предложил использовать AsyncTask для выполнения любых механизмов, необходимых для запуска, затем в onPostExecute () разрешить возобновить запуск вашей программы, чтобы она могла показыватьDialog (B) для всего, что ей нужно. Таким образом, если отображается диалоговое окно A, вы можете остановить процесс запуска и не показывать b.

public class MyAsyncStartup extends AsyncTask<Integer,Integer,MyResult> {
     MyActivity activity;

     public MyResult handleBackground() {
         if( somethingWentWrong ) return null;
     }

     public onPostExecute( MyResult result ) {
          if( result == null ) {
             showDialog(B);
          } else {
             activity.resumeStartupAndShowA();
          }
     }
}
1 голос
/ 25 июля 2011
  1. Какой диалог будет отображаться первым, не определено, и вы не должны полагаться на один диалог перед другим, как указано выше.Планировщик потоков не является тождественно детерминированным во всех ситуациях.
  2. Вам необходимо заблокировать мьютекс (или любое другое блокирующее устройство), чтобы убедиться, что один отображается перед другим.
0 голосов
/ 25 июля 2011

Вы не можете показать B, пока не узнаете, будет ли отображаться буква A. Так что вам придется ждать рабочего потока, несмотря ни на что. Можно ли поместить showDialog (B) в другой поток, как этот?

onCreate(Bundle savedInstanceState){
    // show dialog A if something is not correct
    new Thread(){
         public void run(){
               runOnUiThread(new Runnable(){
                   public void run(){
                       if(something is wrong) {
                           showDialog(A);
                       }
                       showDialog(B);
                   }
               });
               }
         }
    }.start();
}
...