0

Найдено, что странный bahaviour ProgressDialog.Диалог прогресса не отображается точно после show()?

Я показываю ProgressDialog в onClickListener списка, прежде чем начать новую тему и dismiss его внутри этого потока, но после все работы выполняются:

GlobalProgressDialog.show(getActivity()); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //...all other logic 
      GlobalProgressDialog.dismiss(); 
     } 
    }).start(); 

и что GlobalProgressDialog я использую для упрощения вызовов:

public class GlobalProgressDialog{ 
private static ProgressDialog progressDialog; 

public static void show(Activity activity){ 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setMessage("Loading..."); 
    progressDialog.show(); 
} 

public static void dismiss(){ 
    if (progressDialog != null) { 
     progressDialog.dismiss(); 
    } 
} 

}

Диалог появляется, но НЕ после show() называемый! Я отлажена его и выяснили, что существуют 4 стандартные классы Android эксплуатируются:

  1. AdapterView.java
  2. AbsListView.java
  3. Handler.java
  4. Looper.java

И только после LooperProgressDialog находится на свечах. Можно ли обмануть это или исправить? Или, может быть, есть какая-то моя ошибка в коде? Что бы это могло быть?

Задача Задача заключается в том, что задержка между щелчком пункта и show() равна 1 сек. Таким образом, приложение замерзает в течение 1 секунды. И только тогда появляется диалог, и вся работа выполняется 1-2 секунды, иногда даже 0,5 секунды. В таких случаях не рекомендуется смотреть замороженное приложение и мигать в течение 0,5 секунд.

Заранее спасибо.

+0

Простое решение - использовать 'AsyncTask' вместо' Thread' –

+0

Я уже пробовал AsyncTask. Он работает одинаково. Между 'preExecute()' и щелчком по-прежнему есть промежуток времени – AnZyuZya

ответ

0

Здесь вы должны использовать AsyncTask.

public class DialogAsync extends AsyncTask<Void, Void, Void> { 

    private Context context; 
    private ProgressDialog progressDialog; 

    public DialogAsync(Context context) { 
     this.context = context; 
     progressDialog = new ProgressDialog(context); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.show(); 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     // Perform your logic here 
     return null; 

    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     progressDialog.dismiss(); 
    } 


} 

Использование:

DialogAsync globalProgessDialog = new DialogAsync(getActivity()); 
globalProgessDialog.execute(); 
+0

AsyncTask не решает эту проблему – AnZyuZya

1

Вы делаете слишком много работы, в основном потоке. show() отобразит диалог, но он будет делать это в основном потоке. Он не блокирует выполнение до тех пор, пока он не будет уволен. Итак, что-то, что вы делаете в своем коде после вызова show() и которое вы не показываете нам, вызывает задержку появления диалогового окна.

Для того, чтобы быть понятным снова, это не имеет ничего общего с Thread, который вы начинаете и меняете его на AsyncTask, но это не поможет, хотя это может быть хорошей идеей сделать это в любом случае, если шаблон соответствует вашему использование случай.

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