android - 如何显示两个 Activity 之间的进度对话框?

标签 android android-activity progressdialog

我有一个问题。我需要从一项 Activity 转到另一项 Activity 。我的第二个 Activity 有一个很大的 xml 布局,有很多元素(我说的是大约四百个),然后需要几秒钟(太多)来显示第二个 Activity 。

如何在两个 Activity 之间显示进度对话框?

我正在尝试使用后台任务来执行此操作。

我的 Activity A 中有这个方法:

  private void goToYear() {
   Intent intent = new Intent();
   intent.setClass (getBaseContext(), YearActivity.class);
   startActivity( intent);
  }

在我的 Activity B 中:

public class YearActivity extends Activity {

 private String  TAG = "YearActivity ::";

 private ProgressDialog pd = null;


    @Override
    public void onCreate( Bundle savedInstanceState) {
        super.onCreate( savedInstanceState);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working...", "Calculating the screen...", true, false);

        // Start a new thread that will download all the data
        new MakeYearTask().execute();

    }

    private void initCalendar () {
      this.setContentView( R.layout.calendar_year);   

   ...
   ...
   initialize values
   ...
   ...

    }


    private class MakeYearTask extends AsyncTask<String, Void, Object> {
        protected Void doInBackground(String... args) {
            Log.i("YearActivity::MakeYearTask", "MakeYearTask Background thread starting");

   YearActivity.this.initCalendar();


        }

        protected void onPostExecute(Object result) {

            if (YearActivity.this.pd != null) {
             YearActivity.this.pd.dismiss();
            }
        }
   } 
}

你可以看到我在 onCreate 方法中创建了 setContentView

这行不通。它给了我一个异常(exception),像这样:

12-09 19:49:17.729: ERROR/AndroidRuntime(218): java.lang.RuntimeException: An error occured while executing doInBackground()
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.lang.Thread.run(Thread.java:1060)
12-09 19:49:17.729: ERROR/AndroidRuntime(218): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewRoot.checkThread(ViewRoot.java:2629)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewRoot.requestLayout(ViewRoot.java:545)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.View.requestLayout(View.java:7657)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewGroup.addView(ViewGroup.java:1749)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewGroup.addView(ViewGroup.java:1731)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2186)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2239)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.app.Activity.setContentView(Activity.java:1620)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar(YearActivity.java:42)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.access$0(YearActivity.java:41)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:120)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:1)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     ... 4 more

最佳答案

从一开始这就是糟糕的设计。如果您有如此大量的数据要呈现给用户,这些数据可能会被滚动浏览,您应该改用 AdapterView 子类,例如 ListView GridView 。包含近 400 个元素的 XML 布局非常大。

我明白你想做什么(你正试图在一个单独的 Thread 上使用 执行庞大的 View 层次结构的冗长构建AsyncTask,但您发现它在您试图触及非 UI Thread 上的 View 层次结构时被炸毁了)。

即使您在构建层次结构时设法在前台实现了某种进度条,我也不确定系统是否会提供在膨胀 View 时回调进度信息的方法 层次结构(但我可能是错的)。

AdapterView 正是为解决此类问题而创建的。对于 AdapterView,内存中通常只存在一个屏幕的 Views。例如,您可能有一个包含 1000 行的表格,但一次只有 7 行适合屏幕,内存中可能一次只存在 8 行 View。此外,适配器还应回收 View,进一步优化性能。

关于android - 如何显示两个 Activity 之间的进度对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4402813/

相关文章:

android ProgressDialog : setting custom view instead of message - does this work?

android - 防止后退按钮取消 DialogFragment

android.net.uri getQueryParameterNames() 替代方案

java - 将选项卡 View 与底部导航相结合

android - 如何在 Jetpack compose 中处理 Espresso 空闲资源......?

android - 通知 Intent 未启动 Activity android

android - 应用程序兼容性 21 : name = colorPrimary not working together with name = actionBarStyle

android - 一个简单的线性布局是否回收它的 subview ?

通过单击应用程序图标打开时,Android 应用程序会重新启动

android - 如何处理显示 ProgressDialog 的方向变化?