启动泛型Activity并等待AsyncTask完成

时间:2016-06-04 12:48:07

标签: android android-asynctask

从活动X开始,当某个事件发生时,活动A被启动(是一个进度条),并且此活动A启动一个AsyncTask,当完成时,关闭活动A并返回活动X.此事件不能在很多不同的活动中执行,AsyncTask执行的代码可以不同(通常必须从Activity X访问很多变量)。

所以我想只有一个Activity A,但是让它在AsyncTask中执行不同的代码片段。这里的问题是我无法使用自定义构造函数构造活动A(例如传递将在AsyncTask中执行的runnable)。

我试图将活动X中的代码作为Parcelable传递,但每次我想调用活动A时,它都会强迫我编写大量无用且重复的Parcelable相关代码。

这有什么诀窍吗?我没有使用Java 8,所以lambdas不是一个选项。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

使用进度条提示用户在您执行某项操作时等待时,请尝试启动包含进度条而不是其他活动的对话框。通过这种方式,您可以做(我认为)您想要做的事情。然后,在任务完成时关闭对话框,您不需要在活动之间来回移动大量数据。

例如:

your_dialog.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myProgressDialog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white_trans"
android:gravity="center">

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="36dp"
    android:layout_height="36dp"
    android:indeterminate="true" />

如果需要,可以为对话框添加自定义样式,以添加类似

的styles.xml
<style name="myCustomDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:windowBackground">@color/my_color</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

然后,在您的活动X中,调用对话框

Dialog d = new Dialog(this, R.style.myCustomDialog);
d.setContentView(R.layout.your_dialog);
d.show();
AsyncTask task.execute(); //Execute your task

当任务结束时,不要忘记关闭对话框,或者设计布局,让用户控制(如果可能)完成任务以取消它,并在需要时关闭对话框。

希望它有所帮助。