我正在使用Android 3.2的严格模式,在我的Activity的onCreate期间遇到了StrictModeDiskReadViolation错误。 我尝试将执行SQL查询的代码移动到以下位置:
以下是我的代码:
- 一个新的线程。
- 一个新的AsyncTaskLoader。
- 一个新的AsynTask。
以下是我的代码:
AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Dao<Listino, Integer> dao = DatabaseHelper.getHelper(ListinoActivity.this).getListinoDao();
if (dao.countOf() == 1)
{
long id = dao.queryForAll().get(0).getId();//long non int
final Intent intent = new Intent(ListinoActivity.this, ListinoProdottiActivity.class);
intent.putExtra("listino_id", id);
intent.setAction(Intent.ACTION_MAIN);
ListinoActivity.this.finish();
ListinoActivity.this.startActivity(intent);
}
} catch (SQLException e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
MyToast.makeText(ListinoActivity.this, "Errore ottenere i listini", MyToast.LENGTH_SHORT).show();
}
});
e.printStackTrace();
}
return null;
}
};
asyncTask.execute();
AsyncTaskLoader async = new AsyncTaskLoader(this) {
@Override
public Object loadInBackground() {
//do stuff, violation still here
return null;
}
};
async.loadInBackground();
Thread t = new Thread() {
@Override
public void run() {
super.run();
//do stuff, violation still here
}
};
t.run();
Thread.run()
标记为过时以避免这个问题。它可以被一个可重写的受保护方法所替代,或者整个子类化Thread
的想法可以被弃用,而改用Runnable
。太多人因此深感困惑,即使是经验丰富的专业人士也难免犯错。 - Jules