2012-06-19 138 views
3

我對Android 3.2使用嚴格模式,在Activity期間onCreate期間得到StrictModeDiskReadViolationStrictModeDiskReadViolation只能用AsyncTask解決,爲什麼?

我試圖移動,做一個SQL查詢代碼:

  • Thread
  • 新的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(); 

回答

3

你沒有一個叉Thread。要撥出Thread,請致電start()。您調用run(),它只是在當前線程上運行run()方法。

而你甚至沒有接近正確使用Loader框架。您在那裏的代碼不僅與您使用Thread所做的相同的缺陷遭受了同樣的瑕疵,但這不是您使用Loader的方式。

+1

我想'Thread.run()'需要被標記爲不贊成以避免這個問題。它可以被一個可以被覆蓋的受保護的方法所取代,或者'Thread'的子類化的整個想法可以被棄用,而傾向於使用'Runnable's。太多人因此而感到困惑,即使是經驗豐富的專業人員也容易犯這個錯誤。 – Jules

相關問題