0

我想在应用程序初始化时显示一些消息和进度条。Android setContentView被onCreate中的AsyncTask抑制

第一次运行我的应用程序时,我需要将一些字词词典插入到SQLite数据库中。要做到这一点,我有一个AsyncTask打开我的SQLiteOpenHelper并再次关闭它,只是这样数据库初始化完成一次。

private class AsyncDbInit extends AsyncTask<Void, Void, Void> { 
    private Context context; 
    private Intent intent; 

    public AsyncDbInit(Context context, Intent intent){ 
     this.context = context; 
     this.intent = intent; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     DatabaseHandler db = new DatabaseHandler(this.context); 
     db.close(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void param) { 
     context.startActivity(this.intent); 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... params) {} 
} 

此的AsyncTask被称为在我的onCreate()方法,但我也试图从在onStart()和的onResume()不更迭运行它。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dispatcher); 

    ... //some code finding the right intent 

    new AsyncDbInit(this, nextIntent).execute(); 
} 

不知何故,这最后一行,调用AsyncTask,阻止我的UI显示;在AsyncTask完成并且新活动启动之前,屏幕保持空白。 当我评论这条线时,UI显示得很好。

我唯一能想出的就是SQLiteOpenHelper以某种方式阻止了UiThread,但我无法找到任何相关信息。

回答

0

在AsyncTask中,我们有一些方法。就像在doInBackground()中一样,我们在后台执行我们想要完成的任务,并且还有两个方法,onPreExecute()和onPostExecute()。创建并进度对话框并在onPreExecute()方法中显示对话框,并在onPostExecute()方法中将其关闭。

0

尝试在线程池执行程序中使用AsynTask.executeOnExecutor()。如果这可行,这意味着与加载您的用户界面有关的事情也是使用AsyncTask。默认情况下AsyncTasks在单个工作线程上按顺序运行,这可能会引入争用。这个连续执行通常是你想要的,但并非总是如此。

您的UI是否使用任何库来加载字符串或其他内容?你能提供你的布局XML吗?

+0

我已经尝试了与线程池执行程序executeOnExecutor(),但它没有奏效。还是一样的UI冻结。 我现在用一个按钮启动AsyncTask。视图现在加载,但按下按钮后几秒钟,我的屏幕变黑,直到AsyncTask完成。 – Dasyel