0

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

第一次运行我的应用程序时,我需要将一些单词词典插入 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,但我也找不到任何相关信息。

4

2 回答 2

0

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

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

于 2015-10-06T16:40:55.760 回答
0

在 AsyncTask 我们有一些方法。就像在 doInBackground() 中一样,我们在后台做我们想做的事情,也有两种方法,即 onPreExecute() 和 onPostExecute()。创建和进度对话框并在 onPreExecute() 方法中显示对话框并在 onPostExecute() 方法中将其关闭。

于 2015-10-06T15:51:14.710 回答