java.lang.IllegalStateException: AssetManager has been finalized 意思是:AssetManager已被终止了。

8
昨天我睡觉时我的应用程序还在运行,但今天当我尝试运行它时,它根本无法启动。一旦我尝试打开它,它就会崩溃并显示一个java.lang.IllegalStateException。我已经多次回退到我的代码中,以排除最近我所做的任何事情,但依然如此。这毫无意义,一个应用程序怎么可能在一夜之间停止工作呢?我在互联网上搜索了这个错误,但没有太多有用的信息。这真的是一个奇怪的错误吗?
以下是完整的堆栈跟踪:
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.IllegalStateException: AssetManager has been finalized! at android.os.Parcel.readException(Parcel.java:1439) at android.os.Parcel.readException(Parcel.java:1385) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1947) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1419) at android.app.Activity.startActivityForResult(Activity.java:3390) at android.app.Activity.startActivity(Activity.java:3583) at com.android.launcher2.Launcher.startActivity(Launcher.java:2442) at com.android.launcher2.Launcher.startActivitySafely(Launcher.java:2469) at com.android.launcher2.AppsCustomizePagedView.onClick(AppsCustomizePagedView.java:584) at android.view.View.performClick(View.java:4240) at android.view.View$PerformClick.run(View.java:17721) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5136) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)
就像我说的,似乎不是我做的任何事情,所以我不确定要发布哪些代码。但是,考虑到应用程序在启动时崩溃,以下是两个主要类的代码,这些类应该首先启动:
public class App extends Application {

  private static App instance;
  private static final String TAG = "Starter";

  @Override
  public void onCreate() {
    super.onCreate();

    instance = this;
    // Enable Local Datastore.
    Parse.enableLocalDatastore(this);

    //TODO: Register subclasses
//    ParseObject.registerSubclass(Challenge.class);

    //Parse server
    Log.d(TAG, "Initializing Parse");
    Parse.initialize(new Parse.Configuration.Builder(this)
            .applicationId(getString(R.string.parse_app_id))
            .clientKey(getString(R.string.parse_client_key))
            .server(getString(R.string.server_address)).build()
    );

    //Facebook
    if (AccessToken.getCurrentAccessToken() == null)
      ParseFacebookUtils.initialize(this);

    ParseUser.enableAutomaticUser();
    ParseACL defaultACL = new ParseACL();
    // Optionally enable public read access.
    defaultACL.setPublicReadAccess(true);
    defaultACL.setPublicWriteAccess(true);
    ParseACL.setDefaultACL(defaultACL, true);
    Log.d(TAG, "Parse ready");
  }

  public static App getInstance(){
    return instance;
  }
}

SplashActivity

public class SplashActivity extends AppCompatActivity {

    private static final String TAG = "Splash";
    private boolean firstTime = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Hide title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_splash);

        firstTime = getSharedPreferences(Constants.GENERAL_SHARED_PREFS, MODE_PRIVATE)
                .getBoolean(Constants.FIRSTTIME, true);


        if (isLoggedIn())
            if (firstTime)
                startActivity(new Intent(SplashActivity.this, FirstTimeActivity.class));
            else
                startActivity(new Intent(SplashActivity.this, MenuActivity.class));

        else {
            Log.d(TAG, "Calling Home");
            startActivity(new Intent(SplashActivity.this, WelcomeActivity.class));
            finish();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    public boolean isLoggedIn() {
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        String parseSession = ParseUser.getCurrentUser().getSessionToken();
        return parseSession != null;
    }
}

将代码添加到问题中。 - Zoe stands with Ukraine
@LunarWatcher 我不确定要发布什么代码,因为似乎这不是我做的事情。我只是发布了两个应该在应用程序启动时运行的类。请参见编辑后的问题。 - Mauricio
请查看我的回答@Mauricio。 - Zoe stands with Ukraine
2个回答

6

您的堆栈跟踪链接到AOSP中的此类

我认为这个崩溃与您的应用程序无关,而是Launcher类中的错误。尝试通过USB调试安装并查看是否可以解决问题。

但仍有一些细节不清楚。这些行(从堆栈跟踪底部到顶部)是com.android.launcher2包中引起问题的行:

https://android.googlesource.com/platform/packages/apps/Launcher2/+/android-4.2.2_r1/src/com/android/launcher2/AppsCustomizePagedView.java#584

https://android.googlesource.com/platform/packages/apps/Launcher2/+/master/src/com/android/launcher2/Launcher.java#2469

https://android.googlesource.com/platform/packages/apps/Launcher2/+/master/src/com/android/launcher2/Launcher.java#2442

从这个错误中,我假设您正在使用Nexus或Pixel(或任何具有未更改的源代码的设备,表示为原生Android)。

从我所看到的这个错误,这不是与您的应用程序相关的错误。它似乎是您正在使用的启动器的问题。尝试通过USB调试安装,或更改启动器,并查看是否可以解决问题。还可以尝试重新启动设备。

此外,从您的代码中我看不到使用可包含类


我重新启动了设备,问题解决了,但我仍然不明白为什么会发生这种情况。这可能是在应用程序生产环境中发生的吗?还是只是在调试时出现的?我正在 BLU Studio 5.0 LTE 上进行测试。 - Mauricio
不确定。它可能会在生产环境(生产、alpha和beta)和调试环境中发生。由于与您的应用程序无关,而是与启动器有关,因此也可能会发生在任何其他应用程序中。 - Zoe stands with Ukraine

1
这个错误也可能是由于即时运行与Android模拟器失去连接导致的,因此新的应用程序更改未在模拟器中保留。

再次运行应用程序将解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接