开始新的Android Activity是如此之慢

时间:2011-05-14 16:54:51

标签: android android-activity

我想开一个新的活动:

Intent intent = new Intent(homeScreen.this, EmployeeService.class);         
Bundle b = new Bundle();
b.putInt(Constants.SERVICE_DETAIL_L1_ID_MSG, ServiceIndex.SRV_L1_EMPLOYMENT);
b.putInt(Constants.SERVICE_DETAIL_FOCUS_POS_MSG, 2);
intent.putExtras(b);
startActivity(intent);

但是,目标Activity(EmployeeService)变得可见需要很长时间。从Logcat,我看到:

05-14 23:43:31.727: INFO/ActivityManager(59): Displayed activity fr.playsoft.happylille/.employee.EmployeeService: 7050 ms (total 7050 ms)

我不敢相信只需要7秒钟就可以开一个新活动。我在onCreate()中添加了一个日志,但是看到它只需要5ms来完成onCreate。

谁能告诉我如何找到这个问题的根源?

3 个答案:

答案 0 :(得分:3)

您应该将代码Html.fromHtml(desc);移动到一个线程以使其异步。在新打开的onCreate()的{​​{1}}期间,可以安全地启动此线程。

在该线程结束时,您可以从UI线程运行Activity

tvDesc.setText()

更一般地说,设备上的7秒可能意味着另一个上的20秒,所以beware the ANR

(下面对Boy的评论进一步编辑,此答案的前一版本不再准确/有效)

答案 1 :(得分:1)

Shlublu's answer不正确,不允许您从非UI线程进行UI更新!

它似乎起初有效,但那只是运气,时机。

只是一个快速丑陋的测试证明它会在“正确”的时机出错。这里我每100毫秒设置一个文本。将在大约1秒内崩溃:

      new Thread() {

        @Override
        public void run() {
            while (true) {
                someTextView.setText("bla");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();

会抛出此错误:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

我认为您应该通过Html.fromHtml(desc)RxJava

执行AsyncTask

答案 2 :(得分:0)

将您打开的新活动代码放入Thread中。并且运行代码可能需要更少的时间来打开另一个活动。可能会有所帮助。