3

私はアンドロイド 3.2 に厳密モードを使用してStrictModeDiskReadViolationおりonCreateActivity.

SQLクエリを実行するコードを次の場所に移動しようとしました:

  • 新しいThread
  • 新しいAsyncTaskLoader
  • 新しいAsynTask

問題はAsyncTaskViolation が消えただけで、なぜ他の 2 つの方法がうまくいかなかったのだろうか?

これが私のコードです:

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

1 に答える 1

3

あなたはフォークしませんでしたThread。a を fork するにはThread、 を呼び出しますstart()。を呼び出しました。これは、現在のスレッドでメソッドをrun()実行しただけです。run()

Loaderそして、フレームワークを適切に使用することさえできませんでした。そこにあるコードは、 で行ったのと同じ欠陥に悩まされているだけでThreadなく、Loader.

于 2012-06-19T11:55:12.590 に答える