2010-04-24 45 views
15

我有一個Android活動,它從URL抓取RSS提要,並使用SAX解析器將每個項目從XML粘貼到數組中。這一切都很好,但如預期的那樣,需要一些時間,所以我想使用AsyncActivity在後臺執行它。我的代碼如下:Android ASync任務ProgressDialog直到後臺線程完成後才顯示

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(); 
    } 
    } 

我在onCreate()

new AddTask().execute(); 

items = parser.getItems()工作正常通話 - items是包含從XML每個項目的數組列表。我面臨的問題是,在開始活動時,我在onPreExecute()中創建的ProgressDialog直到之後纔會顯示,方法已完成doInBackground()。即我得到一個黑色的屏幕,一個長時間的停頓,然後是一個完整的項目列表。爲什麼會發生這種情況?爲什麼不是UI繪圖,ProgressDialog顯示,解析器獲取項目並逐漸將它們添加到列表中,然後ProgressDialog解散?

+0

在「解析器獲取項目並逐步將它們添加到列表」部分中,緩慢的步驟將在解析中,並且此時不會向列表添加任何內容。因此,你所有的物品都會很快被撞到列表中,所以不要指望這裏有太多「增量」的效果。 – CommonsWare 2010-04-24 01:08:02

+0

這是沒有問題的,我並不介意插入是如何「增量」的,我只想讓ProgressDialog在後臺工作完成時顯示出來,並在完成時消失。 – jackbot 2010-04-24 11:27:48

回答

10

這對我的作品

@Override 
protected void onPreExecute() { 
     dialog = new ProgressDialog(viewContacts.this); 
     dialog.setMessage(getString(R.string.please_wait_while_loading)); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 
+0

這個東西真的有用+1 – 2011-11-25 06:24:06

+4

這與jackbot的原始代碼有何不同?你只是稍做改變就做同樣的事情。 – 2012-02-04 03:39:57

+3

這不是答案。與原始代碼沒有區別。 – 2012-03-10 18:05:21

13

我懷疑的東西擋住你的UI線程你執行任務後。例如,我所看到的人做這樣的事情:

MyTask myTask = new MyTask(); 
TaskParams params = new TaskParams(); 
myTask.execute(params); 
myTask.get(5000, TimeUnit.MILLISECONDS); 

這裏的get調用會阻塞UI線程(這大概是這裏分拆任務...),這將阻止任何UI相關的東西在任務的onExExecute()方法中,直到任務實際完成。哎呦!希望這可以幫助。

+5

Upvote提到一個task.get阻止用戶界面,我需要在某個地方看到,謝謝! – 2011-03-24 23:50:04

+0

有同樣的問題。還有什麼可以阻止用戶界面線程除了get()方法? – 2012-02-04 03:46:41

+0

你先生是英雄。謝謝! – binaryguy 2012-05-03 08:47:05

1

如果您在實際活動中對AsyncTask進行子類化,則可以使用onPostExecute方法將後臺工作的結果分配給調用類的成員。

結果作爲此方法中的參數傳遞(如果指定爲第三種泛型類型)。

這樣,你的UI線程就不會像上面提到的那樣被阻塞。儘管如此,您必須注意子類之外的結果的任何後續使用,因爲後臺線程仍可能正在運行,並且您的成員不具有新值。

4

這是因爲你使用了AsyncTask.get(),它阻止了UI線程「如果需要,等待計算完成,然後檢索其結果。」。

正確的做法是通過構造函數將Activity實例傳遞給AsyncTask,並在AsyncTask.onPostExecution()中完成想要做的任何事情。

+0

這就是我正在尋找的,非常感謝! – Scadge 2014-08-15 07:46:18

相關問題