如何在两个活动之间显示“进度”对话框?

时间:2010-12-09 20:29:20

标签: android android-activity progressdialog

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

如何在两个活动之间显示“进度”对话框?

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

我的活动A中有这个方法:

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

在我的活动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();
            }
        }
   } 
}

您可以看到我使用setContentView方法生成onCreate

这不起作用。它给了我一个例外,像这样:

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

4 个答案:

答案 0 :(得分:1)

这是一个糟糕的设计开始。如果要向用户显示如此大量的数据(可能会滚动浏览),则应使用AdapterView子类,例如ListViewGridView。具有近400个元素的XML布局非常大。

我理解您要做的事情(您尝试使用View在单独的Thread上执行庞大AsyncTask层次结构的冗长构建,但是您我们发现,尝试触摸非UI View上的Thread层次结构会让您感到震惊。

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

创建

View来解决这类问题。使用AdapterView时,内存中通常只有一个屏幕值AdapterView。例如,您可以拥有一个包含一千行的表,但一次只有七行适合屏幕,一次只有八行Views可能存在于内存中。此外,适配器还应回收View s,进一步优化性能。

答案 1 :(得分:0)

这可能不是最好的解决方案,但你可以做的是扩展android中使用的基本主题,并将窗口背景设置为指示活动正在加载的图像。然后将该主题设置为活动B.现在,当活动B加载时,它将显示您的drawable而不是黑色窗口。您甚至可以通过动画列表获得创意,并获得某种不确定的加载效果。

答案 2 :(得分:0)

您是否尝试在onResume()中执行new MakeYearTask().execute();

虽然不够优雅,但您可以在创建时触发延迟线程帖子等待几个毫秒。

编辑:

我只是这个错误:

(Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views)

你是从AsyncTask修改UI吗?

您应该只在doInBackground()中构建数据,但在onPostExecute()中更新ui。

答案 3 :(得分:0)

您的格式有点偏,但如果我理解正确,您就会在initCalendar()的{​​{1}}中致电AsyncTaskdoInBackground() s。

不允许您这样做

AsyncTask用于长时间运行的操作,例如HTTP调用,数据库访问等。获得所需内容后,请从doInBackground()致电initCalendar()