0

Я хочу показать некоторое сообщение и индикатор выполнения, пока мое приложение инициализируется.Android setContentView, подавленный AsyncTask в onCreate

Мне нужно вставить некоторые словари слов в базу данных 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() без Succes.

@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, останавливает мой интерфейс. экран просто остается пустым, пока не будет завершена работа AsyncTask, и начнется новое действие. Когда я прокомментирую эту строку, пользовательский интерфейс отображается просто отлично.

Единственное, что я могу придумать, это то, что SQLiteOpenHelper каким-то образом блокирует UiThread, но я ничего не мог найти об этом.

ответ

0

В AsyncTask у нас есть несколько методов. Как и в doInBackground(), мы делаем то, что хотим сделать в фоновом режиме, и есть два метода: onPreExecute() и onPostExecute(). Создайте и выполните диалог и покажите диалог в методе onPreExecute() и отпустите его в методе onPostExecute().

0

Попробуйте использовать AsynTask.executeOnExecutor() с помощью исполнителя пула потоков. Если это работает, это означает, что что-то, связанное с загрузкой пользовательского интерфейса, также использует AsyncTask. AsyncTasks по умолчанию запускается последовательно в одном рабочем потоке, и это может привести к конкуренции. Это серийное исполнение часто то, что вы хотите, но не всегда.

Используете ли вы пользовательские библиотеки для загрузки строк или другого содержимого? Можете ли вы предоставить свой макет XML?

+0

Я попытался выполнить executeOnExecutor() с исполнителем пула потоков, но это не сработало. Тем не менее, тот же UI замерзает. Теперь я запускаю AsyncTask с помощью кнопки. Вид теперь загружается, но через несколько секунд после нажатия кнопки мой экран становится черным, пока не будет выполнена AsyncTask. – Dasyel

Смежные вопросы