其他分享
首页 > 其他分享> > android-StrictModeDiskReadViolation仅通过AsyncTask解决,为什么?

android-StrictModeDiskReadViolation仅通过AsyncTask解决,为什么?

作者:互联网

我为Android 3.2使用严格模式,并且在Activity中的onCreate期间获取了StrictModeDiskReadViolation.

我试图将执行SQL查询的代码移至:

>新线程.
>一个新的AsyncTaskLoader.
>一个新的AsynTask.

问题是只有AsyncTask使得Violation消失了,我想知道为什么其他两种方法不起作用?

这是我的代码:

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();

解决方法:

您没有派生线程.要派生线程,请调用start().您调用了run(),它只是在当前线程上运行了run()方法.

而且您甚至没有接近正确使用Loader框架.您那里的代码不仅遭受与Thread相同的缺陷,而且不是使用Loader的方式.

标签:android-asynctask,android
来源: https://codeday.me/bug/20191201/2078874.html