2015-10-16 37 views
0

我的應用程序的第一個活動是檢查數據庫並在需要時升級它。Android setContentView和計算

@Override 
public void onCreate(Bundle savedInstanceState) { 
    setTheme(getThemeFromPreferences(this)); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_first); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    //Test et remplissage de la BDD 
    ProgressBar progressBar = (ProgressBar) findViewById(R.id.firstProgressBar); 
    DatabaseFeeder.testAndFeed(this, progressBar); 
    //Launch welcoming activity 
    Intent i = new Intent(this, AccueilActivity.class); 
    startActivity(i); 
} 

的DatabaseFeeder.testAndFeed靜態方法是有點慢,因爲它的資產進行讀取,因此它可以採取像5秒填充數據庫。

問題是:在饋線完成前沒有設置contentView! 我的活動全部爲空5秒鐘,然後彈出我的內容視圖,包括完全填充的進度欄。

這是爲什麼?按照異步任務代碼

+0

嘗試訪問裏面的進度條oncreate而不是onResume。只需在onResume中解散它。 –

+0

已經嘗試過,並沒有工作,也試過onStart()。有沒有解僱,這不是一個進步Dialog。 –

回答

1

運行:

這將讓應用程序的主線程自由渲染需要的視圖。 此外,從應用程序主線程中分離長期運行的操作總是一個好主意。

+0

我認爲這可能是一個線程問題。你能解釋背後的原因嗎?偶然的機會,沒有辦法說「渲染視圖然後做其他事情」? –

+0

這是因爲您阻止了應用程序主線程。函數'setcontentView()'立即返回,因爲系統將在單獨的線程上擴展視圖。此線程無法將結果回發給主線程,因爲它被長時間運行的DB操作阻塞。如果您使用'AsyncTask'在單獨的線程上執行數據庫操作,則主線程將可以自由處理其他重要任務。 –

+0

好,很好的解釋!但是我怎麼能讓我的DatabaseFeeder調用Asyntktask的publishProgress? –

1

這很簡單,在您的數據庫操作的onCreate()menthod內部調用一個Asynctask,並在onPostExecute()內部更新您的UI並關閉進度對話框。

背後的原因是,你在你的MainThread,當過你的所有操作都將完成執行UI updets,你要更新您的UI。 數據庫操作應在後臺或獨立線程內執行,因此在執行操作時不會影響主UI線程。