在一些测试中,我设法将模拟器冻结到必须创建新模拟器的程度。在下面的代码中,我意外拼错了一个班级名称和Class.forName
threw
RuntimeException()
ClassNotFoundException
。然后ActivityManager
正在执行Start proc org.acra.CrashReportDialog
。这是在一个循环中运行并冻结模拟器可能因为onCreate()
永远不会完成,我不确定。
当Emulator启动时,我有android.permission.RECEIVE_BOOT_COMPLETED
启动我的应用程序。
除了将Class.forName
代码移离Application
onCreate()
或编写更好的代码之外,还有什么方法可以阻止这种情况吗?
public class Application extends android.app.Application {
@Override
public void onCreate() {
super.onCreate();
ACRA.init(this);
ACRA.getErrorReporter().setReportSender(new AcraReportSender(this));
// gets id, create it if it dose not exist
ACRA.getErrorReporter().putCustomData("APPLICATION_ID_UUID", SettingsManager.applicationId());
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
ArrayList<String> contactManager = new ArrayList<String>();
TypedArray contactManagerClasses = getResources().obtainTypedArray(R.array.contact_managers);
for (int index = 0; index < contactManagerClasses.length(); index++)
contactManager.add(contactManagerClasses.getString(index));
contactManagerClasses.recycle();
TypedArray managerClasses = getResources().obtainTypedArray(R.array.managers);
for (int index = 0; index < managerClasses.length(); index++)
if (isContactsSupported() || !contactManager.contains(managerClasses.getString(index)))
try {
Class.forName(managerClasses.getString(index));
Log.d("Application","LOADING MANAGER " + managerClasses.getString(index));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
managerClasses.recycle();
TypedArray tableClasses = getResources().obtainTypedArray(R.array.tables);
for (int index = 0; index < tableClasses.length(); index++)
try {
Class.forName(tableClasses.getString(index));
Log.d("Application","LOADING TABLE " + managerClasses.getString(index));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
tableClasses.recycle();
onServiceStarted();
}
......
....
答案 0 :(得分:1)
简短回答否。
即使您删除了ACRA,您也会发现您的活动一遍又一遍地重新启动。这是因为Android尝试重新启动崩溃的应用程序。在您的情况下,它在构建应用程序时崩溃。
最好的建议是让你的启动无懈可击。