我有一个类,记录器,它捕获传感器数据并将其写入数据库。所有数据库处理都在 Recorder 中进行。在这里,我在一个新线程中运行它。mContext 来自 getApplicationContext()。
Runnable startRunnable = new Runnable(){
public void run() {
Recorder recorder = new Recorder((SensorManager) getSystemService(SENSOR_SERVICE), mContext);
recorder.start();
}
};
recorderThread = new Thread(startRunnable);
recorderThread.start();
以下是 Recorder 的相关位:
public Recorder(SensorManager sensorManager, Context context){
mSensorManager = sensorManager;
mContext = context;
}
void start(){
List <Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor sensor : sensorList){
mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
}
}
public void onSensorChanged(SensorEvent event) {
SensorDatabase dbHelper = new SensorDatabase(mContext);
mDb = dbHelper.getWritableDatabase();
if(mDb != null && mDb.isOpen()){
ContentValues values = new ContentValues();
values.put(DataColumns.ACCURACY, event.accuracy);
// more values stuff ...
mDb.insert(SensorDatabase.TABLE_NAME, null, values);
mDb.close();
}
}
应用程序记录数据,但出现 ANR 错误。如果我这样做是为了不在记录器中初始化数据库,则不会出现 ANR 错误。
这个 Runnable 怎么会在这里阻塞 UI 线程?没有回调,UI 线程从不尝试打开数据库连接,至少我不打算这样做。
我查看了 ANR 的 traces.txt,它说线程“main”正在执行:
android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)
任何指针?我很困惑。