我有一个类,录音机,捕捉传感器数据并将其写入到数据库。所有数据库处理都在记录器中进行。在这里我正在一个新的线程中运行它。 mContext来自getApplicationContext()。SQLite的相互作用导致ANR
Runnable startRunnable = new Runnable(){
public void run() {
Recorder recorder = new Recorder((SensorManager) getSystemService(SENSOR_SERVICE), mContext);
recorder.start();
}
};
recorderThread = new Thread(startRunnable);
recorderThread.start();
下面是相关位的记录:
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错误。如果我这样做使得数据库不在Recorder中初始化,则不会有ANR错误。
这个Runnable的怎么会在这里阻塞UI线程?没有回调,并且UI线程永远不会尝试打开数据库连接,至少我不打算这么做。
我看着traces.txt的ANR,故称线程 “主” 被执行:
android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)
任何指针?我很困惑。
也许使用的主要应用程序上下文是什么问题?如果你被困住了,想要尝试一些东西,创建一个新的Service类来包装你的Recorder逻辑,然后使用该服务作为上下文 – Mike