【问题标题】:Show progress bar in AsyncTask在 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_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 秒。然后给我看一个生成的表格。

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

【问题讨论】:

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

标签: android android-asynctask android-progressbar


【解决方案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/… .
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2013-06-27
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
相关资源
最近更新 更多