【问题标题】:Android activity takes too long to loadAndroid Activity 加载时间过长
【发布时间】:2016-01-29 15:01:32
【问题描述】:

在加载 ativity 时,我必须初始化 TextTOSpeech API 的对象,但是当我初始化我的 TTS 对象时,启动 Activity 需要 4-5 秒。我尝试在 Async Task 和 Thread 中初始化它,但结果是一样的。如何让我的活动加载更快?这是我的线程初始化 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);
                }
            });
        }
    }

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

LoadingThread thread = new LoadingThread();
        thread.run();

【问题讨论】:

  • 您能否发布您的整个 onCreate 以及活动的 XML。
  • 您是否在真实设备上试用过您的应用?因为模拟器可能有那么多时间来启动。
  • @katmanco 我使用的是我的真实设备而不是虚拟设备
  • 如果加载需要那么长时间,那么加载需要那么长时间。你不会改变这一点。但是处理它的方式(并根据 Google 设计指南),您应该以 UI 快速加载并允许用户快速与其交互的方式设计您的 Activity,即使他们必须看到进度微调器或其他东西当 TTS api 在后台加载时。

标签: android multithreading android-activity


【解决方案1】:

应用程序class 是执行此操作的错误位置。如果您愿意,可以使用应用程序的onCreate() 方法来启动Service。你应该在Service 中实现这个后台线程,因为Service 的目的是在后台做事。应用程序class 应该很少使用。这是维持最少全局状态的最后手段。

将此代码移入Service 后,Android 已经为您调用了Looper.prepare()

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

需要明确的是,实际问题是他在一个尚未调用 Looper.prepare() 的线程内创建了一个 Handler(通过 new FileManager())。正确的解决方法是在主线程上创建处理程序,即在 ActivityService callbacks 之一中。

【讨论】:

    【解决方案2】:

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

    new Thread(new LoadingThread()).start();
    

    你也很可能在这里遇到异常,因为这需要在主线程上运行:

    ActivityMain.mNotepad.onStopSpeaker(s);
    

    你需要使用 Handler 或者 Activiy.runOnUiThread() 方法来处理这个

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 2016-06-20
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多