我希望在我的应用初始化时显示一些消息和进度条。
我需要在第一次运行应用程序时将一些单词词典插入到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,但我也找不到任何相关内容。
答案 0 :(得分:0)
在AsyncTask中我们有一些方法。就像在doInBackground()中一样,我们在后台完成我们想要完成的事情,并且有两种方法,例如onPreExecute()和onPostExecute()。创建并进行对话框并在onPreExecute()方法中显示该对话框,并在onPostExecute()方法中将其关闭。
答案 1 :(得分:0)
尝试将AsynTask.executeOnExecutor()与线程池执行程序一起使用。如果这样可行,则意味着加载UI所涉及的内容也使用AsyncTask。默认情况下,AsyncTasks在单个工作线程上顺序运行,这会引入争用。此序列执行通常是您想要的,但并非总是如此。
您是否使用任何库来加载字符串或其他内容?你能提供你的布局XML吗?