Android StrictModeDiskReadViolation只能通过AsyncTask解决,为什么?
我在android 3.2上使用严格模式,并且在我的Android StrictModeDiskReadViolation只能通过AsyncTask解决,为什么?,android,android-asynctask,Android,Android Asynctask,我在android 3.2上使用严格模式,并且在我的活动中onCreate期间获得strictmodediskreadvillance 我尝试将执行SQL查询的代码移动到: 一个新的线程 新的AsyncTaskLoader 一个新的AsynTask 问题只是AsyncTask使违规行为消失,我想知道为什么其他两种方法不起作用 这是我的密码: AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, V
活动中onCreate
期间获得strictmodediskreadvillance
我尝试将执行SQL查询的代码移动到:
- 一个新的
线程
- 新的
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();
AsyncTask AsyncTask=new AsyncTask(){
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
Dao Dao=DatabaseHelper.getHelper(ListinoActivity.this.getListinoDao();
if(dao.countOf()==1)
{
long id=dao.queryForAll().get(0.getId();//long非整型
最终意图=新意图(ListinoActivity.this、ListinoProdottiActivity.class);
意向书。putExtra(“listino_id”,id);
intent.setAction(intent.ACTION_MAIN);
ListinoActivity.this.finish();
ListinoActivity.this.startActivity(intent);
}
}捕获(SQLE异常){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
MyToast.makeText(ListinoActivity.this,“Errore ottenere i listini”,MyToast.LENGTH_SHORT.show();
}
});
e、 printStackTrace();
}
返回null;
}
};
asyncTask.execute();
AsyncTaskLoader async=新建AsyncTaskLoader(此){
@凌驾
公共对象loadInBackground(){
//做点什么,你还在这里吗
返回null;
}
};
async.loadInBackground();
线程t=新线程(){
@凌驾
公开募捐{
super.run();
//做点什么,你还在这里吗
}
};
t、 run();
您没有分叉线程。要分叉线程
,请调用start()
。您调用了run()
,它只是在当前线程上运行run()
方法
而且您甚至没有正确地使用加载程序
框架。您的代码不仅与线程
具有相同的缺陷,而且使用加载程序
的方式也并非如此,我认为线程.run()
需要标记为已弃用以避免此问题。它可以被一个可以被覆盖的受保护方法所取代,或者整个子类化线程
的思想可能会被弃用,转而使用可运行
s。太多的人对此感到困惑,即使是有经验的专业人士也很容易不时犯错误。。。