如何通过启动一个新的活动显示ProgressDialog?

目标:有一个ProgressDialog显示“加载…”,直到下一个Activity完全加载并显示在屏幕上。

尝试ProgressDialog上下文和活动设置为发起活动。 还尝试了getApplicationContext()和getParentContext()。 最后两种方法的例外情况。 由于非简单的布局文件,目标活动的渲染速度较慢,因此需要执行此操作。 (由于组织问题,目前无法修复此问题。)发现目标活动需要1-2秒的时间才能到达OnCreate,然后屏幕会变黑,持续5秒以上,然后绘制。 渲染速度很慢。 用Hierarchy Viewer进行审查,看到很多红球,但现在不能修复。

阅读一些相关的,但还没有find一个修复。 例如,获取上下文的各种方法有什么区别?

例如,这两个崩溃。 使用源的“这个”Activity也不起作用。

// Context parentContext = this.getParent().getBaseContext(); Context parentContext = this.getApplicationContext(); ProgressDialogMenuable theProgressDialog = new ProgressDialogMenuable(parentContext,this); theProgressDialog.setTitle("yeeha"); theProgressDialog.setMessage("weewah"); theProgressDialog.setIndeterminate(true); theProgressDialog.setCancelable(true); theProgressDialog.show(); 

另外,奇怪的是,当我这样做时没有任何反应:theProgressDialog.show(); ActivityHelper.changeActivity(this,v,InsMyHoldingsActivity.class,extraMap,-1,-1); 用户点击button显示下一个活动,但ProgressDialog与活动启动冲突,除了button变成黄色ontouch之外实际上没有发生。 下面的button工作。 删除ProgressDialog创build,它的工作原理。 没有控制台消息logging。 有点对开发人员有一定的偏见。

Solutions Collecting From Web of "如何通过启动一个新的活动显示ProgressDialog?"

你可以显示这样的进度对话框 –

定义这一点

 private ProgressDialog pd = null; 

在你的活动课上

把它放在你的onCreate(这里不要直接setContentView)

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.pd = ProgressDialog.show(this, "Fancy App", "Loading...Please wait...", true, false); // Start a new thread that will download all the data new IAmABackgroundTask().execute(); } 

//背景繁重

 class IAmABackgroundTask extends AsyncTask<String, Integer, Boolean> { @Override protected void onPreExecute() { // showDialog(AUTHORIZING_DIALOG); } @Override protected void onPostExecute(Boolean result) { // Pass the result data back to the main activity ActivityName.this.data = result; if (ActivityName.this.pd != null) { ActivityName.this.pd.dismiss(); } setContentView(R.layout.main); } @Override protected Boolean doInBackground(String... params) { //Do all your slow tasks here but dont set anything on UI //ALL ui activities on the main thread return true; } } 

还要经过这个:http://developer.android.com/training/improving-layouts/index.html来优化布局性能。 也使用Traceview来寻找瓶颈

有两种方法

第一种方法使用asynchronous任务

如果您正在执行繁重的任务,例如在这种情况下从服务器加载数据或parsingxml,请使用AsynTask <>如果要从ActivityA调用ActivityB,

* step-1 *创build一个AsyncTask类。 在doBackground()方法内写入所有的后台任务,完成任务后,你想调用一个代码在onPostExecute()中写入的活动,执行方法

 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); 

第二种方法

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

要么

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

这是我的代码,可以帮助。

在这里,我只发布AsyncTask的第一个方法,即onPreExecute

User_AsyncTask扩展AsyncTask:

 public class User_AsyncTask extends AsyncTask<String, String, String> { String response = ""; @Override protected void onPreExecute() { try { if (progressDialog != null) progressDialog.cancel(); } catch (Exception e) { } progressDialog = ProgressDialog.show(DisplayDetails.this, "", "Please wait...", true, true); progressDialog.setCancelable(false); progressDialog.show(); }