2011-10-28 128 views
0

我在android中創建了一個耗時的操作線程。我想讓主屏幕顯示進度對話框,並顯示一條消息,通知操作正在進行中,但是我希望該對話框在線程完成後關閉。我已經嘗試加入,但它鎖定線程並不顯示對話框。我試着使用:線程完成時關閉對話框

dialog.show(); 
mythread.start(); 
dialog.dismiss(); 

但隨後的對話框不顯示。我怎樣才能做出這個序列,但等待線程結束而不鎖定主線程?

這是據我得到:

public class syncDataElcanPos extends AsyncTask<String, Integer, Void> { 
    ProgressDialog pDialog; 
    Context cont; 
    public syncDataElcanPos(Context ctx) { 
     cont=ctx; 
    } 

    protected void onPreExecute() { 
    pDialog = ProgressDialog.show(cont,cont.getString(R.string.sync), cont.getString(R.string.sync_complete), true); 
} 

protected Void doInBackground(String... parts) {   
    // blablabla... 
    return null; 
} 

protected void onProgressUpdate(Integer... item) { 
    pDialog.setProgress(item[0]); // just for possible bar in a future. 
} 

protected void onPostExecute(Void unused) { 
    pDialog.dismiss(); 
} 

但是,當我試着執行它時,它給了我一個例外:「無法添加窗口」。

回答

1

要做到這一點有兩種方法可以做到這一點,(我更喜歡第一第二個:的AsyncTask):

第一:你顯示你的alertDialog,然後在方法run()你應該做這樣的

@override 
public void run(){ 
//the code of your method run 
//.... 
. 
. 
. 
//at the end of your method run() , dismiss the dialog 
YourActivity.this.runOnUiThread(new Runnable() { 
public void run() { 
     dialog.dismiss(); 
    } 
}); 

} 

二:使用的AsyncTask像這樣:

class AddTask extends AsyncTask<Void, Item, Void> { 

    protected void onPreExecute() { 
//create and display your alert here 
    pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Downloading data ...", true); 
} 

protected Void doInBackground(Void... unused) { 

    // here is the thread's work (what is on your method run() 
    items = parser.getItems(); 

    for (Item it : items) { 
     publishProgress(it); 
    } 
    return(null); 
} 

protected void onProgressUpdate(Item... item) { 
    adapter.add(item[0]); 
} 

protected void onPostExecute(Void unused) { 
    //dismiss the alert here where the thread has finished his work 
    pDialog.dismiss(); 
} 
    } 
0

以及在AsyncTask在上postexecute你可以打電話解僱

這裏是從其他線程的例子

class AddTask extends AsyncTask<Void, Item, Void> { 

    protected void onPreExecute() { 
     pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true); 
    } 

    protected Void doInBackground(Void... unused) { 
     items = parser.getItems(); 

     for (Item it : items) { 
      publishProgress(it); 
     } 
     return(null); 
    } 

    protected void onProgressUpdate(Item... item) { 
     adapter.add(item[0]); 
    } 

    protected void onPostExecute(Void unused) { 
     pDialog.dismiss(); 
    } 
    } 
+0

謝謝大家的幫助,會嘗試AsyncTask選項,看看它是怎麼回事... – MarioV

+0

如何在進度對話框中添加上下文? MyActivity.this不適合我,說它不能用這些參數創建,它只是採取活動本身而不是上下文。 – MarioV

+0

你是否將類AddTask聲明爲Activity的InnerClass?如果是的話,那麼它應該工作,如果沒有,所以你應該將上下文傳遞給你的類AddTask – Houcine

3

當你的線程完成,使用runOnUIThread方法來關閉該對話框。

runOnUiThread(new Runnable() { 
public void run() { 
     dialog.dismiss(); 
    } 
});