【发布时间】:2012-10-22 18:07:38
【问题描述】:
目标:拥有一个显示“正在加载...”的 ProgressDialog,直到下一个 Activity 完全加载并显示在屏幕上。
尝试将 ProgressDialog 上下文和活动设置为原始活动。还尝试使用 getApplicationContext() 和 getParentContext()。最后两种方法的例外情况。需要这样做,因为由于非简单的布局文件,目标 Activity 的渲染速度很慢。 (由于组织问题,现在无法解决这个问题。)结果目标 Activity 需要 1-2 秒才能 OnCreate,然后屏幕变黑长达 5 秒以上,然后它会绘制。渲染很慢。使用 Hierarchy Viewer 进行了审核,发现很多红球,但现在无法修复。
阅读一些相关但尚未找到解决方法。例如。 What's the difference between the various methods to get a Context?
例如这两个崩溃。使用源 Activity 的“this”也不起作用。
// 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); 用户单击按钮以显示下一个活动,但 ProgressDialog 与 Activity 启动冲突,除了按钮在触摸时变为黄色之外实际上没有任何反应。下面的按钮有效。删除 ProgressDialog 创建,它可以工作。没有记录控制台消息。对开发者来说肯定有点反感。
【问题讨论】:
-
在您的新活动中创建一个异步任务,在那里进行所有处理,在执行后设置布局元素。在创建时显示进度条,并在执行后关闭。
-
让我试试。我只能子类化(而不是更改)目标活动的情况。所以,这可能行得通。
-
如果您作为解决方案发布,那么我会接受。我不认为 ProgressDialog 可以跨越活动的生命周期(多个活动);但是可以通过这种方法对用户产生影响,一个 PDlg 在 Activity A 中,然后在 ActivityB 中,就像你说的那样。我实际上使用了与 AsynTask 不同的语法,但我相信它在语义上是相同的。最终 Runnable r = new Runnable() { public void run() { setupActivityDisplay(); // 需要一段时间的事情 theProgressDialog.dismiss(); } }; (new Handler()).postDelayed(r, 1000);
-
更多研究表明,在完成 Activity 布局之前,无法显示 ProgressDialog。简单地说,对于复杂的布局,用户会在一段时间内看到一个黑色(空白)屏幕。仍在研究中。
-
有一种方法可以显示 ProgressDialog。在创建之后。只需删除布局 setContentView( 从 onCreate 调用。稍后再做。