2011-12-24 63 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替換爲需要一些時間的任何事情。這個想法是在UI線程中執行開始和中斷之間的代碼,並創建一個獨立的線程來處理ProgressDialog。 我的線程有什麼問題?

非常感謝!

回答

2

要等待線程完成,您應該使用Thread.join()方法。但現在我看到你不想等待它完成,但是你需要控制它何時完成。儘管如此,你仍然希望避免以這種方式中斷線程。

在你ShowDialog類中,添加一個dismiss()方法,你可以從你的main調用,而不是interrupt()。還要添加一個boolean dismiss = false實例變量。在dismiss()中,添加dismiss = true,然後notify();。在run()中,用while(!dismiss){wait()}替換常量while()循環(不斷運行,效率非常低)。您仍然需要添加同步塊和異常處理,但這應該讓您有一個良好的開端。

這裏是一個通用的Java(非Android)簡單例子:

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()? – 2011-12-24 15:28:41

+0

@Flav - 不,請調用'show.join()'而不是'sleep'語句。但現在我看到你在這裏嘗試做的更好。更新後的答案... – ziesemer 2011-12-24 15:33:17

相關問題