我想开一个新的活动:
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。
谁能告诉我如何找到这个问题的根源?
答案 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中。并且运行代码可能需要更少的时间来打开另一个活动。可能会有所帮助。