2016-07-15 13 views
-1

私はいくつかのデータベース操作を実行するためにAsyncTaskを持っています。問題は、私がThreadPoolExecutorAsyncTaskを実行してUIスレッドがブロックされてしまうことです。ここに私のコードです:Android AsyncTaskはUIスレッドをブロックします

private class AddToQueue extends AsyncTask<String, Void, String> { 
     int qLength = 0;  

     protected String doInBackground(String... params) { 
      if (db == null) return null; 
      db.delete(DBHelper.QUEUETABLE, null, null); 
      ContentValues cv = new ContentValues(); 
      for (int i = 0; i < qLength; i++) { 
       cv.put(DBHelper.INDEX, i); 
       cv.put(DBHelper.PATH, items.get(i).getPath()); 
       cv.put(DBHelper.TITLE, items.get(i).getTitle()); 
       try { 
        db.insert(DBHelper.QUEUETABLE, null, cv); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       cv.clear(); 
      } 
      return "Executed"; 
     } 

     @Override 
     protected void onPostExecute(String result) { } 

     @Override 
     protected void onPreExecute() { 
      qLength = list.getAdapter().getCount(); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { } 
+1

ContentValues cv = new ContentValues(); for (int i = 0; i < c.getCount(); i++) { c.moveToPosition(i); cv.put(DBHelper.INDEX, i); cv.put(DBHelper.PATH, c.getString(0)); cv.put(DBHelper.TITLE, c.getString(1)); try { // db.insert(DBHelper.QUEUETABLE, null, cv); } catch (Exception e) { e.printStackTrace(); } cv.clear(); 

を置き換えどのように 'AsyncTask'を実行していますか? 'qLength'でやっていることはスレッドセーフではありません。 –

+3

私はちょうどあなたdoloBackgroundを手動で呼び出していないことを願っています – peter

+0

それはブロックされていることをどのように知っていますか?あなたは通常のプールでそれを実行できますか? – Eenvincible

答えて

0

私はそれを解決しました。ちょうどこの1

String sql = "INSERT INTO " + DBHelper.QUEUETABLE + "(" + 
         DBHelper.INDEX + ", " + DBHelper.PATH + ", " + 
         DBHelper.TITLE + ") VALUES (?, ?, ?)"; 
db.beginTransaction(); 
SQLiteStatement stmt = db.compileStatement(sql); 
for (int i = 0; i < c.getCount(); i++) { 
    c.moveToPosition(i); 
    stmt.bindString(1, i + ""); 
    stmt.bindString(2, c.getString(0)); 
    stmt.bindString(3, c.getString(1)); 
    stmt.execute(); 
    stmt.clearBindings(); 
} 
db.setTransactionSuccessful(); 
db.endTransaction(); 
+0

@Sujth多くのレコード(10.000>)で試してみましたか?私もSQLiteStatementを使用していますが、私は "ブロックUIスレッド"の問題があります... –

関連する問題