Android StrictModeDiskReadViolation只能通过AsyncTask解决,为什么?

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

我在android 3.2上使用严格模式,并且在我的
活动中
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。太多的人对此感到困惑,即使是有经验的专业人士也很容易不时犯错误。。。