Yrl*_*lec 8 java sqlite android multiprocessing firebase
由于应用程序在多个进程中打开,我们最近开始在我们的Android应用程序中遇到崩溃.几个不同的错误指向了这一点.比如这个错误:
com.google.firebase.database.DatabaseException:无法获得对Firebase数据库的脱机持久性的独占锁定.这通常意味着您正在使用应用中多个进程的Firebase数据库.请记住,多进程Android应用程序在所有进程中执行Application类中的代码,因此您可能需要避免在Application类中初始化FirebaseDatabase.如果您有意从多个进程使用Firebase数据库,则只能在其中一个进程中启用脱机持久性(即调用setPersistenceEnabled(true)).
我们也看到了SQLite和H2的类似错误.这是一个新问题,我们没有明确允许多个进程运行.我们的AndroidManifest.xml中没有任何内容指定自定义的android:process属性.
我怀疑某些第三方库造成了这种情况.如何确定多个流程的根本原因以及如何预防?
我们的另一个应用是通过ContentProvider连接到此应用.起初我认为它android:multiprocess="true"
是罪魁祸首但将其改为"假"并没有帮助.我仍然怀疑其他应用程序以某种方式触发了新进程的创建.这是如何定义ContentProvider:
<provider
android:name=".DegooContentProvider"
android:authorities="${applicationId}.DegooContentProvider"
android:exported="true"
android:protectionLevel="signature"
android:multiprocess="false">
</provider>
Run Code Online (Sandbox Code Playgroud)
您可以检查您的应用程序类是否有国外进程。这是一个例子:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
if (!isMainProcess()) {
// Do not call thread unsafe logic. Just return
return;
}
// Thread unsafe logic.
...
}
private boolean isMainProcess() {
int pid = android.os.Process.myPid();
ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
String currentProcName = processInfo.processName;
if (processInfo.pid == pid) {
if (TextUtils.equals(currentProcName, BuildConfig.APPLICATION_ID)) {
return true;
}
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
320 次 |
最近记录: |