在 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<Void, Void, Void>
更改为AsyncTask<Void, Void, TableMainLayout>
。然后改变适当的方法。而你的doInBackgound
方法应该是这样的:return new TableMainLayout(context)
。然后在postExecute
中,您可以致电setContentView(tableMainLayout)
。并阅读文档:developer.android.com/intl/ru/reference/android/os/… .以上是关于在 AsyncTask 中显示进度条的主要内容,如果未能解决你的问题,请参考以下文章
我想在进度条文本(变量)中显示处理数据,这在 AsyncTask 类的doingBackground()方法中发生了变化[关闭]