2016-07-15 147 views
-1

我有一個AsyncTask執行一些數據庫操作。問題是當我執行AsyncTaskThreadPoolExecutor 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

你是如何執行'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,但我有「阻止UI線程」的問題... –