Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
启动新的Android活动太慢了_Android_Android Activity - Fatal编程技术网

启动新的Android活动太慢了

启动新的Android活动太慢了,android,android-activity,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

我想开始一项新活动:

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);
但要让目的地活动(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()中添加了一个日志,但只需5毫秒即可完成onCreate


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

你打开的新活动代码放在线程中。运行代码可能会减少打开另一个活动所需的时间。可能会有帮助。

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

在该线程结束时,可以从UI线程运行
tvDesc.setText()

class ExampleThread extends Thread {
    @Override
    public void run() {
         final Spanned spannedText = Html.fromHtml(desc);

         yourNewlyOpenedActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tvDesc.setText(spannedText);
                }
         });
    }
}
更一般地说,一台设备上的7秒可能意味着另一台设备上的20秒,所以

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

不正确,不允许从非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$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。


我认为您应该通过
AsyncTask
或OK执行
Html.fromHtml(desc)
。我知道为什么。因为在目标活动中,我设置了tvdsc.setText(Html.fromHtml(desc));with desc是带有HTML标记的长网页的内容。处理带有可能不受支持的标记的HTML页面,使我的活动缓慢显示!您可以将处理放在一个单独的线程中。@Olafure:这真是个好主意。现在它很好用了。@olafure你能给我举个例子吗。假设我们有for循环,我们需要在onCreate上运行它。我们如何在不同的线程中实现这一点?我不相信您可以在非UI上执行“setText”thread@Boy当我写这篇文章时,我正处于API级别8。这是工作,但我没有重新测试,因为那时(没有必要)。所以我不能保证这仍然有效,你试过了吗?我没有重新测试,因为我非常确定。但我刚刚做了,并将发布一个新的答案,文本太长了here@Boy啊,你又考了!谢谢更新,男孩,我更正了这个答案。@男孩,谢谢!你发现这个答案需要更新,从而帮助了社区(包括我自己)。这应该得到+1:)