2016-07-15 2 views
-1

일부 데이터베이스 작업 수행을 위해 AsyncTask이 있습니다. 문제는 UI 스레드가 차단되고 ThreadPoolExecutorAsyncTask을 실행할 때입니다. 여기에 내 코드가있다 :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(); 

를 대체? 또한'qLength'로 무엇을하는지는 스레드로부터 안전하지 않습니다. –

+3

그냥 doInBackground를 수동으로 호출하지 않기를 바랍니다. – peter

+0

차단되는 것을 어떻게 알 수 있습니까? 일반 수영장에서 실행할 수 있습니까? – Eenvincible

답변

0

나는 그것을 해결했다. 당신은`AsyncTask`을 실행하는 방법은 그냥이 하나

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 스레드"문제가 ... –

관련 문제