首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android activity加载时间太长

Android activity加载时间太长
EN

Stack Overflow用户
提问于 2016-01-29 23:01:33
回答 3查看 1.2K关注 0票数 0

我必须初始化TTS的对象,因为加载了活动,但是当我初始化我的TextTOSpeech对象时,它需要4-5秒来启动activity。我试图在异步任务和线程中初始化它,但结果是相同的。怎样才能让我的活动加载得更快?下面是初始化TTS对象的线程的代码。

代码语言:javascript
复制
     class LoadingThread implements Runnable{
        @Override
        public void run() {
            //load settings of the app
            appSettings = new AppSettings(getApplicationContext());
            appSettings.loadSettings();
            //making ready TTS before the user interact with it
            textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {
                    ttsOptions = new HashMap<String, String>();
                    ttsOptions.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,ActivityMain.UTTER_ID);
                    textToSpeech.setLanguage(Locale.ENGLISH);
                    textToSpeech.setSpeechRate(AppSettings.getSpeakerSpeed());
                }
            });
            textToSpeech.setOnUtteranceCompletedListener(new TextToSpeech.OnUtteranceCompletedListener() {
                @Override
                public void onUtteranceCompleted(String s) {
                    ActivityMain.mNotepad.onStopSpeaker(s);
                }
            });
        }
    }

我在我的活动的onResume()中调用这个线程,比如

代码语言:javascript
复制
LoadingThread thread = new LoadingThread();
        thread.run();
EN

回答 3

Stack Overflow用户

发布于 2016-01-29 23:13:27

应用程序class不是这样做的地方。如果您愿意,也可以使用应用程序的onCreate()方法来启动Service。您应该在Service中实现此后台线程,因为Service的目的是在后台执行操作。应用程序class应该很少使用。这是维护最小数量的全局状态的最后手段。

一旦你把这段代码移到Service中,安卓就已经为你调用了Looper.prepare()

当OP调用他的FileManager类的构造函数时,他实际上是试图在Thread中创建一个Handler。虽然我上面的评论仍然是正确的,但它与OP的问题无关,因为他只是对Activity而不是Application进行了子类化。

需要明确的是,实际问题是他在一个线程中创建了一个Handler,而这个线程还没有调用Looper.prepare() (通过新的FileManager())。正确的修复方法是在主线程上创建处理程序,即在ActivityService callbacks中创建处理程序。

票数 0
EN

Stack Overflow用户

发布于 2016-01-29 23:27:39

你错误地启动了你的线程,你只是调用了Runnable的run方法,它在同一个线程中执行。如果您需要在单独的线程中运行它,请使用:

代码语言:javascript
复制
new Thread(new LoadingThread()).start();

另外,你很可能会在这里得到异常,因为这需要在主线程上运行:

代码语言:javascript
复制
ActivityMain.mNotepad.onStopSpeaker(s);

您需要使用处理程序或Activiy.runOnUiThread()方法来处理此问题

票数 0
EN

Stack Overflow用户

发布于 2016-01-29 23:37:54

您需要调用new Thread(runnable).start()来在不同的线程上运行它,而不是在runnable.run()上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35087550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档