在 AsyncTask 中显示进度条

Posted

技术标签:

【中文标题】在 AsyncTask 中显示进度条【英文标题】:Show progress bar in AsyncTask 【发布时间】:2016-06-11 16:44:27 【问题描述】:

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

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_
    android:layout_
    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_
        android:layout_
        android:id="@+id/progressBar"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

new TableMainLayout(context) - 使用数据生成表格布局,它也是一个 UI,这就是我在 doInBackground() 中使用 runOnUiThread() 的原因

问题是当我在手机上运行我的应用程序时,它没有显示进度条。它只是冻结了我的应用程序 5 秒。然后给我看一个生成的表格。

我应该怎么做才能显示进度条?

【问题讨论】:

从不在 AsyncTask 中执行 runOnUiThread。它破坏了 AsyncTask 的全部目的 你的布局是从互联网或类似的地方获取数据吗? nasch,TableMainLayout 从数据库中获取数据。 【参考方案1】:

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

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

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

【讨论】:

我无法在 XML 中预定义 TableLayout,因为它使用 SQLite 中的数据动态生成 Rishabh Tatiraju,我可以在 XML 中创建进度条,但是如何在不附加 setContentView() 的情况下包含此 XML? @gigs 跟随该链接...它展示了如何将视图设置为父布局的子级并设置视图。【参考方案2】:

AsyncTask 的主要目的是在后台线程中加载一些东西,然后将其传递给 UI 线程。 doInBackground 在非 UI 线程中运行,但你让它在 UI 线程中运行...

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

【讨论】:

根据您的逻辑,我应该在哪里保存从数据库中检索到的数据 doInBackground ?如果我的数据库有超过 800 行。 您必须将AsyncTask&lt;Void, Void, Void&gt; 更改为AsyncTask&lt;Void, Void, TableMainLayout&gt;。然后改变适当的方法。而你的doInBackgound 方法应该是这样的:return new TableMainLayout(context)。然后在postExecute 中,您可以致电setContentView(tableMainLayout)。并阅读文档:developer.android.com/intl/ru/reference/android/os/… .

以上是关于在 AsyncTask 中显示进度条的主要内容,如果未能解决你的问题,请参考以下文章

我想在进度条文本(变量)中显示处理数据,这在 AsyncTask 类的doingBackground()方法中发生了变化[关闭]

水平进度条不适用于 Asynctask Android 下载文件?

AsyncTask 和进度条 [重复]

安卓进度条不显示

如何使用 asynctask 执行数据库操作来实现进度条?

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?