我有问题。我需要从一个活动转到另一个活动。我的第二个活动有一个很大的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
答案 0 :(得分:1)
这是一个糟糕的设计开始。如果要向用户显示如此大量的数据(可能会滚动浏览),则应使用AdapterView
子类,例如ListView
或GridView
。具有近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}}中致电AsyncTask
。 doInBackground()
s。
将AsyncTask
用于长时间运行的操作,例如HTTP调用,数据库访问等。获得所需内容后,请从doInBackground()
致电initCalendar()
。