Показывать индикатор выполнения в AsyncTask
Я хочу показать круговой индикатор выполнения, пока таблица генерируется в фоновом режиме. Мой код в асинхронной задаче:
class DoWork extends AsyncTask<Void, Void, Void>{
Context context;
public DoWork(Context con){
this.context = con;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
setContentView(R.layout.content_progress);
pb = (ProgressBar) findViewById(R.id.progressBar);
pb.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
runOnUiThread(new Runnable() {
public void run() {
setContentView(new TableMainLayout(context));
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
pb.setVisibility(View.INVISIBLE);
super.onPostExecute(result);
}
}
Код в content_progress.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.standart.trainschedule.ProgressActivity"
tools:showIn="@layout/activity_progress">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
new TableMainLayout (context) - генерировать макет таблицы с данными, а также это пользовательский интерфейс, поэтому я использую runOnUiThread() в doInBackground()
Проблема в том, что когда я запускаю свое приложение на телефоне, оно не показывает индикатор выполнения. Он просто заморозил мое приложение на 5 секунд. а потом покажи мне сгенерированную таблицу.
Что я должен сделать, чтобы показать индикатор?
2 ответа
Ваш ProgressBar находится в макете content_progress. Но вы заменяете этот макет на TableLayout, и предыдущее представление перезаписывается.
То, что вы можете попробовать, это предварительно определить TableLayout и ProgressBar в XML и установить его как представление содержимого, или определить RelativeLayout программно и добавить оба TableLayout и ProgressBar в качестве представлений
Посмотрите на этот ответ, где было дано, как программно добавить прогрессбар. Вы также можете реализовать аналогичный метод для TableLayout.
Основное назначение на AsyncTask
это загрузить что-то в фоновом потоке, а затем доставить это в поток пользовательского интерфейса. doInBackground
работает в потоке без пользовательского интерфейса, но вы заставляете его работать в одном пользовательском интерфейсе...
Так что если ваш виджет генерирует из данных SQL, просто сгенерируйте его на doInBackground
и выполнить setContentView
в onPostExecute
,