【问题标题】:Why does Androidx.appcompat.AppCompatActivity throw java.lang.NoSuchMethodError: No virtual method getMainExecutor()?为什么Androidx.appcompat.AppCompatActivity会抛出java.lang.NoSuchMethodError: No virtual method getMainExecutor()?
【发布时间】:2019-01-04 08:52:45
【问题描述】:

我最近修改了我的应用程序以使用 AndroidX 库,并尝试在 AppCompatActivity 中使用 androidx.biometric.BiometricPrompt。

但是,我得到以下异常:

java.lang.NoSuchMethodError: 没有虚拟方法getMainExecutor()Ljava/util/concurrent/Executor

我尝试改用应用程序上下文,但也没有用。

import androidx.biometric.BiometricPrompt;
import androidx.appcompat.app.AppCompatActivity;

class MainActivity extends AppCompatActivity {        
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        final BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo.Builder()
            .setTitle("Login")
            .setSubtitle("Perform login with your fingerprint")
            .setNegativeButtonText("Cancel")
            .build();
        new BiometricPrompt(this, getMainExecutor(), onFingerprintAuthentication())
            .authenticate(info, getCryptoObject());
    }
}

这些是我要导入的 AndroidX 库

implementation 'androidx.core:core:1.1.0-alpha03'
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha01'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.annotation:annotation:1.0.1'
implementation 'androidx.mediarouter:mediarouter:1.1.0-alpha01'
implementation 'androidx.browser:browser:1.0.0'
implementation 'androidx.exifinterface:exifinterface:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0-alpha01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.biometric:biometric:1.0.0-alpha03'

【问题讨论】:

  • getMainExecutor 在 API 级别 28 中添加到 Context。但是,ContextCompat (androidx.core.content.ContextCompat) 有一个静态的 getMainExecutor 方法,您应该可以使用它。
  • @Michael 非常感谢!这解决了我的问题。

标签: java android androidx


【解决方案1】:

正如@Michael 在 cmets 中提到的,可以使用

ContextCompat.getMainExecutor(this);

这解决了我的问题。

或者,如this 回答中所述,也可以创建自己的执行器

public class MainThreadExecutor implements Executor {
    private final Handler handler = new Handler(Looper.getMainLooper());

    @Override
    public void execute(@Nonnull Runnable runnable) {
        handler.post(runnable);
    }
}

【讨论】:

    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 2011-04-06
    • 2019-10-15
    • 2022-11-09
    • 1970-01-01
    • 2019-09-12
    • 2016-02-08
    • 2011-06-13
    相关资源
    最近更新 更多