在开发人员控制台的“ ANR”部分中,我可以看到一些有关我的应用程序的报告。有一个引起我的注意,我不明白如何解决所提出的问题:
这是insertIntoLastPositionKnown函数的代码:
public synchronized void insertIntoLastPositionKnown(Location coordinate, Context context) {
if (mdb == null)
mdb = mdbHelper.getWritableDatabase();
try {
if (coordinate != null) {
Cursor c = freeQuery("SELECT * FROM " + TABLE_LAST_POSITION);
if (c != null) {
c.moveToFirst();
if (c.getCount() >= 4) {
mdb.execSQL("DELETE FROM " + TABLE_LAST_POSITION + " WHERE idPosition = (SELECT idPosition FROM " + TABLE_LAST_POSITION + " ORDER BY time ASC LIMIT 1)");
}
c.close();
}
//Inserisco la nuova coordinata
ContentValues values = new ContentValues();
values.put("latitude", coordinate.getLatitude());
values.put("longitude", coordinate.getLongitude());
values.put("accuracy", coordinate.getAccuracy());
values.put("speed", coordinate.getSpeed());
values.put("time", coordinate.getTime());
values.put("insDate", new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", new Locale("it_IT")).format(new Date()));
values.put("provider", coordinate.getProvider());
values.put("networkClass", new Utils(context).getNetworkClass());
mdb.insert(TABLE_LAST_POSITION, "", values);
}
} catch (Exception e) {
wil.WriteFile("203)DbGest - Exception: " + e.toString());
}
}
此问题的本质是什么?
答案 0 :(得分:1)
insertIntoLastPositionKnown
函数在UI线程上执行。大多数IO操作应在辅助线程上执行,以免阻塞UI。阻止UI会导致用户体验无响应,最终android将杀死您的应用。
您可能希望使用AsyncTask
或类似的机制,而不是在UI线程上执行IO。
有关ANR的更多信息,请参见此处:https://developer.android.com/topic/performance/vitals/anr