Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Java Android停止在父类中调用onPause_Java_Android_Android Fragments_Amazon Fire Tv - Fatal编程技术网

Java Android停止在父类中调用onPause

Java Android停止在父类中调用onPause,java,android,android-fragments,amazon-fire-tv,Java,Android,Android Fragments,Amazon Fire Tv,在我的应用程序中,我有一个子类,它扩展了leanback支持库中名为SearchFragment的支持库类。我需要扩展这个类,但不幸的是父SearchFragment类的onPause有一个我无法使用的方法 每次我离开活动时,父类都会运行onPause,它调用我不想要的方法 有没有一种方法可以扩展SearchFragment类,但不允许它运行自己的onPause 这是父类中的onPause方法,我无法更改 android.support.v17.leanback.app.SearchFragme

在我的应用程序中,我有一个子类,它扩展了leanback支持库中名为SearchFragment的支持库类。我需要扩展这个类,但不幸的是父SearchFragment类的onPause有一个我无法使用的方法

每次我离开活动时,父类都会运行onPause,它调用我不想要的方法

有没有一种方法可以扩展SearchFragment类,但不允许它运行自己的onPause

这是父类中的onPause方法,我无法更改

android.support.v17.leanback.app.SearchFragment

@Override
public void onPause() {
    releaseRecognizer(); //Need to stop this from calling
    super.onPause();
}

private void releaseRecognizer() {
    if (null != mSpeechRecognizer) {
        mSearchBar.setSpeechRecognizer(null);
        mSpeechRecognizer.destroy();
        mSpeechRecognizer = null;
    }
}
另外,我这样做的原因是因为这是一个Android TV>Fire TV端口。Fire TV没有语音识别器。

暂停是活动生命周期的一部分,不能忽略,但您可以通过一些技巧来实现。它要求您修改ReleaseRecognitor方法的行为

可按如下方式更改代码:

boolean isReleased;

public void releaseRecognizer() {
   if(isReleased) {
      return;
   }
   ...
   //your code go here
   ...
   isReleased = true;
}

//Somewhere else where you acquire the recognizer again you just set it to false:

public void acquireRecognizer(){

   ...
   isReleased = false
}
通过这种方式,您可以确保releaseRecognizer不会运行代码两次。

正如在onpause中提到的,在onpause中释放系统资源是一种很好的做法。 我想你应该在简历上再弄一次。。作为

或者您应该在onStop或onDestroy中释放识别器。这样,它将保持识别器,直到活动激活

由于onPause是具有公共可访问性的父SearchFragment类的方法之一,因此可以在子类中重写它,而不调用super.onPause。这不会将方法传播到父类,因此不会调用臭名昭著的ReleaseRecognitor


然而,您需要注意实现与SearchFragment的其他生命周期方法正确关联的业务逻辑,以便系统资源不会被滥用。因此,您需要根据您的用例逻辑修改覆盖的代码,以便最终调用onPause。

在我看来,您可以按照其他答案中的建议覆盖SearchFragment onPause,但是删除super.onPause您将面临一些问题。因此,一个安全的解决方案是编写您自己的SearchFragment类复制该类中的所有代码,并将您自己的类装入该类中删除您不希望在onPause方法中调用的方法。通过这种方式,您不会删除超级调用,因此这种方法是安全的。

使用Proguard AssumensideEffects选项来消除SearchFragment中对ReleaseRecognitor方法的调用。这将要求您在启用Proguard的情况下编译代码,但由于所讨论的代码是在某种特定的场景中调用的,因此您可能只在发布版本中使用Proguard

注意,您必须启用优化dontoptimize选项不能设置,因为通过AssumenSideEffects剥离对方法的调用在技术上是一种优化

请确保使用中的建议,将Proguard操作限制在您想在您的案例中优化的特定类上-android.support.v17.leanback.app.SearchFragment


这是在不修改SearchFragment源代码的情况下解决问题的唯一方法。再想一想,你最好只是简单地将必要的类复制到你的项目中,或者在最坏的情况下——将整个leanback支持库作为Gradle子模块插入,并直接修改必要的方法——很有可能,除此之外,FireTV还有其他问题。

您可以在片段中重写onPause方法,而不在片段中调用super.onPause。该方法将不会传播到父类。如果releaseRecognizer类是私有的,该怎么办?SearchFragment类包含onPause和releaseRecognizer方法,无法修改。这是一个锁定的谷歌图书馆。我只能扩展它。我建议修改ReleaseRecognitor行为。顺便说一下,通过查看更新的代码,多次调用releaseRecognizer有什么问题?FireTV不支持android tv等应用程序中的语音识别,因此会失败。我不擅长FireTV,但我认为您可以在活动的onCreate方法中找到这一点,并设置一个全局参数,该参数可在整个程序中使用,以防止不相关的代码丢失如我问题中所述,我无法触摸识别器。如果我用识别器做了什么,它就会失败。Amazon FireTV没有语音识别器。哎呀!您无法修改onPause和releaseRecognizer。我想你应该禁用识别器,说起来容易做起来难。我甚至没有看到一个全球性的方法来做到这一点。在应用程序内搜索很好的发现,但我没有任何尝试。它说无论我在哪里使用这段代码,都有一个字段未找到异常。当然,我现在得到。。。。SuperNotCalledException:Fragment SearchFragment{86aa5eb 0 id=0x7f10009c}没有调用super.onPauseI了解谷歌为何将此捆绑,但亚马逊不允许这样做也是非常令人沮丧的。他们有一个麦克风按钮,但选择不允许开发人员
使用它这可能是一个愚蠢的问题,但我不能扩展和扩展类来避免这种情况,对吗?@osiris355是的,这样不行。但是,如果库是开源的,我们可以尝试将源代码修改为更极端的措施之一。不幸的是,这并不是那么简单,因为SearchFragment类调用leanback支持库中的方法,而google在我复制的片段中的mRowsFragment.getVerticalGridView所在的位置抛出该错误。基本上,该方法是BaseRowFragment中的最终方法,因此我无法调用它从我的项目中。多痛苦啊。不幸的是,一旦复制了一个类,我就必须复制另一个类,再复制另一个…@osiris355我理解你的痛苦,但有时吃一块蛋糕并拥有它是不可能的…另一方面,你总是可以选择遵循建议,然后到处拦截NullPointerException。您必须决定是否需要短期的易捕获异常、使用反射黑客、使用leanback库,或者基本上是任何其他选项的幻觉,包括本答案中概述的Proguard选项。
@Override
public void onResume() {
super.onResume();
acquireRecognizer();
}

@Override
public void onPause() {
super.onPause();
releaseRecognizer();
}
@Override
protected void onStop() {
super.onStop();
releaseRecognizer();
}