我正在使用针对Android 3.2的严格模式,并且在我的StrictModeDiskReadViolation
onCreate
期间收到了Activity
。
我尝试将执行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();
答案 0 :(得分:3)
你没有分叉Thread
。要分配Thread
,请致电start()
。您调用run()
,它只是在当前线程上运行您的run()
方法。
你甚至没有接近正确使用Loader
框架。你在那里的代码不仅会遇到与你Thread
所做的相同的缺陷,但这不是你使用Loader
的方式。