Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.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_Multithreading_Android Activity - Fatal编程技术网

Android活动加载时间太长

Android活动加载时间太长,android,multithreading,android-activity,Android,Multithreading,Android Activity,我必须初始化TextTOSpeech API的对象,因为活动已加载,但在初始化我的TTS对象时,启动活动需要4-5秒。我尝试在异步任务和线程中初始化它,但结果相同。如何使我的活动加载更快?下面是初始化TTS对象的线程的代码 class LoadingThread implements Runnable{ @Override public void run() { //load settings of the app

我必须初始化TextTOSpeech API的对象,因为活动已加载,但在初始化我的TTS对象时,启动活动需要4-5秒。我尝试在异步任务和线程中初始化它,但结果相同。如何使我的活动加载更快?下面是初始化TTS对象的线程的代码

     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);
                }
            });
        }
    }

应用程序
是执行此操作的错误位置。如果需要,可以使用应用程序的
onCreate
()方法启动
服务。您应该在
服务
中实现此后台线程,因为
服务
的目的是在后台做事情。应用程序
应该很少使用。这是维持最低限度的全球状态的最后手段

一旦您将此代码移动到
服务中
Looper.prepare()
将已经被Android调用

OP实际上是在调用他的
文件管理器
类的构造函数时,试图在
线程
内部创建一个
处理程序。虽然我上面的评论仍然正确,但这与OP的问题无关,因为他是活动的子类化,而不是应用程序的子类化


明确地说,实际的问题是,他在一个尚未调用
Looper.prepare()
(通过新的FileManager())的线程内创建了一个
处理程序。正确的修复方法是在主线程上创建处理程序,即在
活动
服务回调中的一个中
如果线程启动不正确,只需调用在同一线程中执行的Runnable的run方法。 如果需要在单独的线程中运行,请使用:

new Thread(new LoadingThread()).start();
此外,您很可能会在此处遇到异常,因为这需要在主线程上运行:

ActivityMain.mNotepad.onStopSpeaker(s);

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

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

能否发布整个onCreate please和活动的XML。您是否在真实设备上尝试应用程序?因为模拟器可能有那么多时间启动。@katmanco我使用的是真实设备,而不是虚拟设备如果加载需要那么长时间,那么加载也需要那么长时间。你不会改变的。但是处理它的方式(根据谷歌的设计指南),你应该设计你的活动,让UI快速加载,并允许用户快速与之交互,即使他们必须在后台加载TTS api时看到进度微调器或其他东西。
ActivityMain.mNotepad.onStopSpeaker(s);