Android Studio-应用程序无法在Android 10.0中运行-在runtime_flags中设置的未知位:0x8000

问题描述

我已经在Android Studio中制作了一个Java应用程序,并在Android 6、7和10上对其进行了测试。

但是它似乎在Android 10上不起作用。

我的Logcat错误

2020-11-08 22:47:43.022 26407-26407/? E/cd.mydataappon: UnkNown bits set in runtime_flags: 0x8000
2020-11-08 22:49:03.515 26407-29671/com.abcd.mydataappone E/Openglrenderer: ReliableSurface: perform returned an error

我的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.abcd.mydataappone">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <application
        android:allowBackup="true"
        android:fullBackupContent="@xml/backup_descriptor"
        android:icon="@mipmap/ic_launcher"
        android:label="Data App"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,RtlEnabled">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我在其他任何地方都找不到答案。

预先感谢。

解决方法

由于我不知道您对 Java 了解多少、java 的确切工作原理以及 concurrency 是什么,因此我将尝试在几乎不需要背景信息的情况下尽可能多地进行解释。


首先,我们将查看 Oracle 的 InterruptedException 文档。

当线程正在等待、睡眠或以其他方式被占用,并且线程在活动之前或期间被中断时抛出。 [...]


这是什么意思?

在回答这个问题之前,您必须初步了解 Thread 的工作原理。

A thread 最初只是一段代码,可以与其他线程分开管理。它可以同时运行(参见concurrency)、计划运行等。


示例

如果你启动一个普通的java程序,main()方法是在自己的线程1中创建的。你所做的一切都将在这个线程中执行。您创建的每个类、您调用的每个方法以及基本上源自 main() 的所有内容。

但是如果您创建一个 Thread,它会在自己的线程 2 中运行。您在 run() 方法中所做的一切都将在线程 2 中执行。


如果您创建新的 Thread 会怎样?

调用 join() 方法。

join() 方法启动线程并正在执行 run()

不仅有不带参数的 join() 方法,还有带参数的 join(long millis)


何时以及为何抛出?

正如 Rahul Iyer 所说,有多种原因。我挑选了其中一些,让你在被叫到时感受一下。

  1. 超时

当超过超时时,确实可以抛出 InterruptedException。当调用 join(long millis) 时会发生这种情况。该参数指定线程可以运行给定的毫秒数。当线程超过此超时时间时,它会被中断。 source(从第 769 行到第 822 行)。

  1. 操作系统正在停止线程

也许 O 运行的 S 系统(Windows、Linux、Android 等)决定停止该程序。为什么?为了释放资源,您的程序被误认为是病毒,硬件正在关闭,用户手动关闭它等。

  1. Thread

    中抛出 InterruptedException

    例如,您已连接到互联网并且正在阅读某些内容,但互联网突然断开连接。

  2. interrupt() 被称为

    如前所述,当您在任何 InterruptedException 上调用 interrupt() 时,也会抛出 Thread(非常合乎逻辑)。


如何处理?

您可以/应该像处理其他所有异常一样处理它。将其包裹在 trycatch 中,声明方法 throws it,记录它等

这可能是最适合您的资源:Handling InterruptedException in Java

,

来自文档:https://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html

公共类 InterruptedException 扩展异常

当线程正在等待、睡眠或其他被占用时抛出,并且线程处于 在活动之前或期间被打断。偶尔一个 方法可能希望测试当前线程是否已被 中断,如果是,立即抛出这个异常。这 可以使用下面的代码来实现这个效果:

if (Thread.interrupted())  // Clears interrupted status!
      throw new InterruptedException();

你可以在这里学习 oracles 教程:

https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

修复它的方法可能是用 Try-Catch 块包围导致它的代码并处理异常。例如(来自 Oracles 教程):

for (int i = 0; i < importantInfo.length; i++) {
    // Pause for 4 seconds
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // We've been interrupted: no more messages.
        return;
    }
    // Print a message
    System.out.println(importantInfo[i]);
}

以上链接中有更多关于如何处理不同场景的示例。

,

很快,当线程或其他一些操作被中断时,通常会抛出 InterruptedException。线程是在做某事还是在睡觉都没有关系,您可以通过调用interrupt() 或其他方法来以编程方式执行此操作,并在“被占用”的线程上执行此操作。