3
我對Android 3.2使用嚴格模式,在Activity
期間onCreate
期間得到StrictModeDiskReadViolation
。StrictModeDiskReadViolation只能用AsyncTask解決,爲什麼?
我試圖移動,做一個SQL查詢代碼:
- 新
Thread
。 - 新的
AsyncTaskLoader
。 - 新的
AsynTask
。
問題是隻有AsyncTask
使違反消失,我想知道爲什麼其他兩種方法不起作用?
這裏是我的代碼:
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's。太多人因此而感到困惑,即使是經驗豐富的專業人員也容易犯這個錯誤。 – Jules