ANR开发人员控制台

时间:2018-06-26 15:19:34

标签: android sqlite

在开发人员控制台的“ ANR”部分中,我可以看到一些有关我的应用程序的报告。有一个引起我的注意,我不明白如何解决所提出的问题:

enter image description here

这是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());
    }
}

此问题的本质是什么?

1 个答案:

答案 0 :(得分:1)

insertIntoLastPositionKnown函数在UI线程上执行。大多数IO操作应在辅助线程上执行,以免阻塞UI。阻止UI会导致用户体验无响应,最终android将杀死您的应用。

您可能希望使用AsyncTask或类似的机制,而不是在UI线程上执行IO。

有关ANR的更多信息,请参见此处:https://developer.android.com/topic/performance/vitals/anr