2013-03-13 2 views
1

У меня есть определенная логика, в которой есть необходимость подождать 5 секунд, прежде чем отклонять счетчик и отобразить диалоговое сообщение. Все работает, но диалоговое сообщение не показано. Если я сделаю то же самое без задержки, это сработает. Мой код:Диалог не показан на Android

public static void showMessageNotSentDialog(Activity inActivity) 
{ 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(inActivity);      
    alertDialogBuilder.setTitle(R.string.error);   

    alertDialogBuilder.setMessage(R.string.error_sending_message); 
    alertDialogBuilder.setCancelable(false); 

    alertDialogBuilder.setPositiveButton(R.string.ok,new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog,int id) { 
     } 

    }); 

    AlertDialog alertDialog = alertDialogBuilder.create();  
    alertDialog.show(); 
} 

public static void showDelayedErrorMessage(final Activity inActivity) 
{ 

    Runnable task = new Runnable() { 
     public void run() { 
      com.test.classes.Spinner.hideSpinner(); 
      showMessageNotSentDialog(inActivity); 

     } 
     worker.schedule(task, com.test.classes.Spinner.TEXT_SPINNER_HIDEOUT_SEC, TimeUnit.SECONDS); 
} 

Попытка показать диалог из пользовательского интерфейса резьбы:

public static void showDelayedErrorMessage(final Activity inActivity) 
{ 

    Runnable task = new Runnable() { 
     public void run() { 
      com.test.classes.Spinner.hideSpinner(); 

      Runnable messageTask = new Runnable() { 
       public void run() { 
        showMessageNotSentDialog(inActivity); 
       } 
       }; 
       inActivity.runOnUiThread(messageTask); 
     } 
     }; 

     worker.schedule(task, com.test.classes.Spinner.TEXT_SPINNER_HIDEOUT_SEC, TimeUnit.SECONDS);   
} 

ответ

1

использование таймер обратного отсчета, и не нужно играть с потоками

new CountDownTimer(5000,5000) { 

     @Override 
     public void onTick(long arg0) { 

     } 

     @Override 
     public void onFinish() { 

     } 
    }.start(); 

onfinish выполняется после 5 секунд

+1

Идеальные! Благодарю. – Misha

1

Вы должны использовать Handler, который может обновить графический интерфейс потока. В принципе можно просто после выполнения на обработчике с задержкой, вот пример:

Handler guiHandler = new Handler(); 
Runnable showDialog = new Runnable(){ 
    public void run(){ 
    //put here the dialog creation 
    } 
} 

postDelayed (showDialog ,5000); // Post for 5 seconds 

Обратите внимание, что создание обработчика должно быть в GUI потоке, в противном случае он не будет работать. и помните, что GUI может управляться только основным потоком.

Смежные вопросы