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

3
我正在使用Android 3.2的严格模式,在我的Activity的onCreate期间遇到了StrictModeDiskReadViolation错误。 我尝试将执行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();
1个回答

3
你没有创建一个新的线程。要创建一个新的线程,你需要调用start()方法而不是run()方法,后者只会在当前线程上运行run()方法。
另外,你并没有正确使用Loader框架。你的代码不仅有和前面提到的Thread相同的问题,而且也不符合使用Loader的正确方式。

1
我认为需要将 Thread.run() 标记为过时以避免这个问题。它可以被一个可重写的受保护方法所替代,或者整个子类化 Thread 的想法可以被弃用,而改用 Runnable。太多人因此深感困惑,即使是经验丰富的专业人士也难免犯错。 - Jules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接