在启动新的活动之前显示进度对话框

5

我有一个名为“Activity1”的活动,还有另一个名为“Activity2”的活动。在“Activity1”中单击按钮后加载“Activity2”。我想要显示进度对话框,直到新的活动被加载。请问您能否向我展示如何编写代码实现这个功能?

5个回答

4
在Activity2的onCreate方法中显示进度对话框,然后在AsyncTask中执行所有耗时加载。在AsyncTask的onPostExecute()方法中关闭进度对话框。

2

使用AsynTask<>,您可以获得您的结果。

在OnPreExecute中显示进度对话框,在OndoInBackground中运行您的活动,在onPostExecute中删除您的对话框。

了解更多请参考此链接


2

有两种方法

第一种方法:使用Async Task

如果你正在进行耗时的任务,例如从服务器加载数据或解析xml,则使用AsynTask<>。如果你想从ActivityA调用ActivityB,则需要执行以下步骤:

*步骤1*创建一个AsyncTask类。在doBackground()方法中编写所有后台任务,在任务完成后,你想要调用一个activity,将代码编写到onPostExecute() post execute方法中。

import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.view.View;



public class LoadingDataFromServer extends AsyncTask {
    Context currentContext = null;

    boolean isCancelled = false;


    public LoadingDataFromServer(Context context) {
        currentContext = context;

    }

    @Override
    protected void onPreExecute() {
        if (DashboardActivity.progressBarLayout != null) {
            DashboardActivity.progressBarLayout.setVisibility(View.VISIBLE);
            // Log.i(TAG,".....Now make progress bar visible.....");
        }

        super.onPreExecute();
    }

    @Override
    protected Object doInBackground(Object... params) {
        // do background processing

        try {
// do background tasks eg sever communication
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
        // progressDialog.dismiss();

        // call second Activity
        Intent i = new Intent(currentContext, com.ActvityB.class);
        super.onPostExecute(result);
    }

    @Override
    protected void onCancelled() {
        // TODO Auto-generated method stub
        isCancelled = true;
        super.onCancelled();
    }

}

步骤2 在你想要跳转到新活动的活动中(例如在ActivityA中),调用AsynTask的execute()方法。

new LoadingDataFromServer(context).execute(null);

第二种方法

  • 首先显示进度对话框。
  • 创建一个线程来执行所有后台任务。当线程完成任务时,取消进度对话框并调用下一个活动。

或者

  • 当线程完成任务时,调用下一个活动,并传递此对象(进度对话框),在新活动中解除这个对话框。

1
其他答案(使用AsynTask)是正确的,但你需要弄清楚的问题是什么导致了你的延迟。是在Activity1后端发生的事情还是在Activity2前端发生的事情。如果你在启动Activity2之前进行一些处理,那么请遵循Last Warrior或Ted Hopp的建议...如果你在Activity2中有一些漫长的加载过程,那么你需要在Activity2的onCreate中首先启动进度对话框,然后将占用处理资源的任何内容移动到一个AsynTask(或另一个线程)中。
我猜在极少数情况下,A1和A2都需要额外的时间,在各自的末尾和前面打开和关闭进度对话框...我不认为有一种方式可以在从一个活动转移到另一个活动时保持一个对话框处于前台。

实际上,在第二个活动中,我正在解析JSON。所以延迟就在第二个活动本身。谢谢。 - Ashish Augustine

1

你可以通过AsyncTask来实现。将需要执行时间的代码放入

doInBackground()

重写asyncTask的方法并将

startActivity(intent) ----放入onPostExecute()中即可。

  protected class InitTask extends AsyncTask<Context, Integer, Integer> {

  @Override protected Integer onPreExcute( Context... params )  {

        //assign progressbar here

}
    @Override protected Integer doInBackground( Context... params )  {

         //do all the stuffs here
         return super.doInBackground( params )

} @Override protected void onProgressUpdate(Integer... values)  {
         super.onProgressUpdate(values); 
         //update progress bar
}

    @Override protected void onPostExecute( Integer result )  {
          super.onPostExecute(result);
          //start activity here
 }

}

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