2010-05-18 32 views
4

我有一個Android應用程序在那裏我做之前完成以下步驟:等待直列線程移動到下一個方法

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    new Thread() { 
     public void run() { 
      //do some serious stuff... 
      dialog.dismiss();   
     } 
    }.start(); 

    stepTwo(); 
} 

而且我想確保我的線程完成stepTwo前();叫做。我怎樣才能做到這一點?

謝謝!

+0

可能是你可以使用isAlive – 2014-06-17 18:40:38

回答

2

線程實例有一個join方法,那麼:

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    Thread t = new Thread() { 
     public void run() { 
      //do some serious stuff... 
      dialog.dismiss();   
     } 
    }; 
    t.start(); 
    t.join(); 
    stepTwo(); 

} 

你可能想,雖然試試這個:

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    Thread t = new Thread() { 
     public void run() { 
      //do some serious stuff... 
      SwingUtilities,invokeLater(new Runnable() { 
       public void run() { 
        dialog.dismiss();   
       } 
      }); 
      stepTwo(); 
     } 
    }; 
    t.start(); 
} 

因爲的onCreate是在UI線程,具有會有聯接凍結UI直到onCreate完成後,保存任何對話框。 stepTwo將不得不使用SwingUtilities.invokeLater自己做任何UI更改。

+1

如果我沒有弄錯,'dialog.dismis()'應該發生在UI線程中。 – aioobe 2010-05-18 21:05:09

+0

@aioobe - 我希望你是對的。這就是SwingUtilities.invokeLater的用途。除非Android是不同的 – sblundy 2010-05-18 21:12:12

+0

謝謝sblundy - 這是工作的大部分,但我的對話不出現,因爲我相信它應該。基本上會發生的是它看起來正確地執行了線程中的任務,然後調用stepTwo();然後對話框出現一瞬間並消失。任何想法如何讓它顯示在它開始線程之前? – Tyler 2010-05-18 21:24:00

2

如果你想在後臺運行,我建議使用the AsyncTask class,這樣可以確保你能夠正確地與UI線程交互。另外,如果您希望代碼在後臺任務完成後運行,那麼您可以直接調用該方法。 onCreate()內沒有理由等待。

您的代碼將是這個樣子:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    new MyAsyncTask().execute(); 
} 

private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 
    private ProgressDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(MyActivity.this, "Please wait..", "Doing stuff..", true); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     //do some serious stuff... 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     dialog.dismiss(); 
     stepTwo(); 
    } 

} 
1

另外,選擇是簡單地移動step2()到線程,以便之後線程任務完成執行:

private void onCreate() { 
    final ProgressDialog dialog = ProgressDialog.show(this, "Please wait..", "Doing stuff..", true); 

    new Thread() { 
     public void run() { 
      //do some serious stuff... 
      dialog.dismiss();   
      stepTwo(); 
     } 
    }.start(); 
} 
+0

如果'stepTwo()'不需要在UI線程上運行,這只是一個選項 – 2014-07-11 09:49:04

相關問題