在AsyncTask中显示进度条

时间:2016-02-28 17:53:11

标签: android android-asynctask android-progressbar

我希望在后台生成表时显示圆形进度条。我在异步任务中的代码:

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) - 生成一个包含数据的表格布局,也是一个UI,这就是我在doInBackground()中使用runOnUiThread()的原因

问题是当我在手机上运行我的应用程序时,它没有显示进度条。它冻结我的应用程序5秒。而不是向我展示生成的表格。

如何显示进度条?

2 个答案:

答案 0 :(得分:0)

您的ProgressBar位于布局content_progress中。但是,您正在使用TableLayout替换该布局,并且之前的视图正在被覆盖。

您可以尝试在XML中预定义TableLayout和ProgressBar并将其设置为内容视图,或以编程方式定义RelativeLayout并将TableLayout和ProgressBar同时添加为视图

查看this answer,了解如何以编程方式添加progressBar。您也可以为TableLayout实现类似的方法。

答案 1 :(得分:0)

AsyncTask的主要目的是在后台线程中加载一些内容,然后将其传递给UI线程。 doInBackground在非UI线程中运行,但您可以在UI中运行...

因此,如果您的小部件是从SQL数据生成的,只需在doInBackground上生成它并在setContentView中执行onPostExecute