2015-10-16 33 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线程。