2016-07-15 2 views
-1

У меня есть AsyncTask для выполнения некоторых операций с базой данных. Проблема заключается в том, что я запускаю AsyncTask на ThreadPoolExecutor, когда поток пользовательского интерфейса блокируется. Вот мой код:Android AsyncTask блокирует пользовательский интерфейс

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

Как вы выполнение 'AsyncTask'? Также то, что вы делаете с 'qLength', не совсем безопасно для потоков. –

+3

Я просто надеюсь, что вы не вызываете doInBackground вручную – peter

+0

Как вы знаете, что он заблокирован? Можете ли вы выполнить его на регулярном пуле? – Eenvincible

ответ

0

Хорошо, я решил. Просто заменить

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

с этим

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 тоже, но у меня есть проблема с блочным интерфейсом. –

Смежные вопросы