Android AsyncTask阻止UI线程

时间:2016-07-15 19:43:23

标签: android android-asynctask

我有AsyncTask来执行某些数据库操作。问题是当我在AsyncTask上执行ThreadPoolExecutor 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 个答案:

答案 0 :(得分: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();