Android setContentView在onCreate中被AsyncTask抑制

时间:2015-10-06 15:24:38

标签: android android-asynctask sqliteopenhelper setcontentview

我希望在我的应用初始化时显示一些消息和进度条。

我需要在第一次运行应用程序时将一些单词词典插入到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) {}
}

在我的onCreate()方法中调用了这个AsyncTask,但是我也尝试从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完成并开始新活动。 当我评论该行时,用户界面显示就好了。

我唯一能想到的是SQLiteOpenHelper以某种方式阻止了UiThread,但我也找不到任何相关内容。

2 个答案:

答案 0 :(得分:0)

在AsyncTask中我们有一些方法。就像在doInBackground()中一样,我们在后台完成我们想要完成的事情,并且有两种方法,例如onPreExecute()和onPostExecute()。创建并进行对话框并在onPreExecute()方法中显示该对话框,并在onPostExecute()方法中将其关闭。

答案 1 :(得分:0)

尝试将AsynTask.executeOnExecutor()与线程池执行程序一起使用。如果这样可行,则意味着加载UI所涉及的内容也使用AsyncTask。默认情况下,AsyncTasks在单个工作线程上顺序运行,这会引入争用。此序列执行通常是您想要的,但并非总是如此。

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