2011-12-24 4 views
0

Вот несколько бит кода:Используя нить, чтобы показать диалог прогресса в Android

public class ShowDialog extends Thread { 
private static String mTitle="Please wait"; 
private static String mText="Loading..."; 
private Activity mActivity; 
private ProgressDialog mDialog; 

ShowDialog(Activity activity) { 
    this(activity, mTitle, mText); 
} 
ShowDialog(Activity activity, String title) { 
    this(activity, title, mText); 
} 
ShowDialog(Activity activity, String title, String text) { 
    super(); 
    mText=text; 
    mTitle=title; 
    mActivity=activity; 
    if (mDialog == null) { 
     mDialog = new ProgressDialog(mActivity); 
     mDialog.setTitle(mTitle); 
     mDialog.setMessage(mText); 
     mDialog.setIndeterminate(true); 
     mDialog.setCancelable(true); 
     mDialog.setOnCancelListener(
      new DialogInterface.OnCancelListener() { 
       @Override 
       public void onCancel(DialogInterface arg0) { 
        mDialog.dismiss(); 
        interrupt(); 
       } 
      }); 
    } 
} 

public void run() { 
    mDialog.show(); 
    while(!isInterrupted()) 
    mDialog.dismiss(); 
    mDialog=null; 
} 

}

И в моей основной деятельности:

ShowDialog show = new ShowDialog(this, "Please wait!","Loading badly..."); 
    show.start(); 
    SystemClock.sleep(2000); 
    show.interrupt(); 

Я знаю, что я мог бы используйте асинхронную задачу и все, но это не то, что я хочу. Замените SystemClock.sleep тем, что занимает некоторое время. Идея состоит в том, чтобы выполнить код между запуском и прерыванием в потоке пользовательского интерфейса и сделать отдельный поток, обрабатывающий ProgressDialog. Что случилось с моей нитью?

Большое спасибо!

ответ

2

Чтобы дождаться завершения Thread, вы должны использовать метод Thread.join(). Но теперь я вижу, что вы не хотите дождаться завершения, но вам нужно контролировать, когда он будет завершен. Тем не менее, вы хотите избежать прерывания потоков таким образом.

В вашем ShowDialog классе, добавить метод dismiss() который вы можете звонить с вашего main вместо interrupt(). Также добавьте переменную экземпляра boolean dismiss = false. В dismiss() добавьте dismiss = true, затем notify();. В run() замените свою постоянную петлю while() (работает постоянно и очень неэффективно) с while(!dismiss){wait()}. Вам все равно придется добавлять блоки синхронизации и обработку исключений, но это должно привести к хорошему старту.

Вот родовым-Java (не андроид) упрощенный пример:

public static class ShowDialog extends Thread{ 

    protected boolean dismiss; 

    public void dismiss(){ 
     dismiss = true; 
     synchronized(this){ 
      notifyAll(); 
     } 
    } 

    @Override 
    public void run(){ 
     System.out.println("Running..."); 
     // Show your dialog here. 
     while(!dismiss){ 
      synchronized(this){ 
       try{ 
        wait(); 
       }catch(InterruptedException ie){ 
        ie.printStackTrace(); 
       } 
      } 
     } 
     System.out.println("Quitting..."); 
     // Dismiss your dialog here. 
    } 

} 

public static void main(String[] args) throws Exception{ 
    ShowDialog sd = new ShowDialog(); 
    sd.start(); 
    Thread.sleep(2000); 
    sd.dismiss(); 
} 

Вы упомянули вы не хотите использовать AsyncTask, но я бы еще пересмотреть. (Каковы ваши причины против этого?)

+0

Итак, вместо Thread.start() Мне нужно использовать Thread.join()? –

+0

@Flav - Нет, вызовите 'show.join()' вместо вашего оператора 'sleep'. Но теперь я вижу, что вы пытаетесь сделать здесь. Обновленный ответ для последующего ... – ziesemer

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

  • Нет связанных вопросов^_^