如何在从一个活动切换到另一个活动时显示进度对话框?

4
我希望在我启动另一个名为B的活动之前,能够展示一个进度对话框(PD)来显示活动A正在完成一些工作,而且B也需要完成一些工作,因为它必须为UI加载大量数据。
我需要一个PD,在从activity A切换到B并加载数据的整个过程中让用户看到。
如何实现呢?
我尝试将静态ProgressDialog存储在MyApplication.java上,并通过以下方法实现:
public static void showProgressDialog(Context c) {
    pd = ProgressDialog.show(c, c.getResources().getString(R.string.app_name), 
        c.getResources().getString(R.string.loading), true, false);    
}
public static void dismissProgressDialog(){
    pd.dismiss();
}

但它不起作用,没有显示任何内容,我不知道为什么。
有什么简单的方法可以实现这个?我知道可以使用异步任务来完成,但对我来说太难了,我无法理解我在网上和谷歌上找到的代码示例。
欢迎提供代码示例。
谢谢。

我知道我可以用异步任务来做,但对我来说太难了。很抱歉,这就是要这么做的方式。 - Falmarri
你能给我一个简单的代码示例吗? - NullPointerException
3个回答

3

嗯,我同意@Falmarri的评论,实现这个功能最简单的方法是使用AsyncTask。因为AsyncTask可以管理UI线程和后台线程。

我总是使用AsyncTask来处理这种情况,但我不认为在这里粘贴我的代码会有所帮助,因为你的要求可能与我的不同,但我认为你可以按照以下方式进行:

创建一个AsyncTask子类并重写以下方法:

  • onPreExecute()... 因为这个方法在UI线程中被调用,您可以创建并显示进度对话框.
  • doInBackground(Runnable task)... 这个方法在后台线程中运行,所以您不必担心线程处理... 您所要做的就是努力工作
    (处理数据、下载数据等)
    并发布任何您想要的UI更新。

  • onProgressUpdate(Object... values)... 这个方法也在UI线程中调用,所以您可以使用进度值更新进度对话框。

  • onPostExecute(Object result)... 这个方法在UI线程中运行,所以您可以显示操作结果并取消显示进度对话框,并调用您的新活动。

您可以在此执行所有操作,包括A活动和B活动,而AsynTask将为您管理线程管理 :)

编辑1:

我不知道您的设计有多复杂,但这里我制作了一个项目示例,也许它不是您想要的,但它具有本答案中描述的所有内容,也许像一个示例工作。

我建议您阅读更多关于这个类的信息,因为它是最重要的之一,这里您可以阅读更多关于这种机制的信息... http://android-developers.blogspot.com/2009/05/painless-threading.html


我不理解它。我怎么知道这个类在执行我的Activity A和Activity B的代码完成时呢?我看不出来这个类怎么知道。如果它不知道A和B要完成任务的时间,那么进度对话框将永远显示。 - NullPointerException
你告诉我可以在这里执行所有操作,但实际上不可能。有很多操作需要在A和B上完成,我的应用程序是按照这种方式设计的。我不能在这里移动。A和B有成千上万行代码。如果我必须在这里移动操作,那么需要花费数周甚至数月的时间,并且我肯定会遇到很多难以解决的错误和问题。 - NullPointerException
不将操作放在这个类中,就无法实现ProgressDialog吗? :S ??? - NullPointerException

1
你可以在你的布局中添加一个进度条:

<FrameLayout
    android:id="@+id/mapLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
        //your layout
    </LinearLayout>

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" >
    </ProgressBar>

</FrameLayout>

在你的活动 onCreate 中加载进度条:
public void onCreate(final Bundle savedInstanceState) {

    mProgress = (ProgressBar) findViewById(R.id.progressBar);
    mProgress.setVisibility(View.VISIBLE);

    //rest your code       
}

当您的活动开始时,请停止进度条:

@Override
protected void onStart() {

    //your code
    mProgress.setVisibility(View.GONE);        
    super.onStart();
}

0
  1. 为所有的加载/进度对话框创建一个单例实例。
  2. 使用ApplicationContext来管理ProgressViews/dialogs。
  3. 通过静态函数在整个应用程序中访问并管理。

这些是实现此功能的三种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接