2014-09-30 84 views
0

在我的应用程序中,我从服务器获取响应,并将从服务器响应中获取的值插入到数据库中。以下是我的代码:批量插入数据库阻塞UI?

String sql = "INSERT INTO "+ tableName +" VALUES (?,?,?,?);"; 
    DatabaseHandler dbHandler = new DatabaseHandler(context); 
    final SQLiteDatabase db = dbHandler.getWritableDatabase(); 
     final SQLiteStatement statement = db.compileStatement(sql); 
     db.beginTransaction(); 
     try { 

       statement.clearBindings(); 

       statement.bindString(2, id); 
       statement.bindString(3, type); 
       statement.bindString(4, value); 

       statement.executeInsert(); 

      db.setTransactionSuccessful(); 
     } finally { 
      db.endTransaction(); 
     } 

     db.close(); 

它正在我的数据库中快速插入,但我的UI屏幕正在冻结。我试着在AsyncTask中调用我的插入代码,但插入需要很长时间。你能不能让我知道我该如何防止我的用户界面被阻止,并防止插入花费很长时间?

谢谢。

+2

“我试着在AsyncTask中调用我的插入代码,但插入需要很长时间”应该不会超过它阻塞你的UI。 – Kiril 2014-09-30 13:42:51

+0

这里只有1个插入。我怀疑这是非常漫长的。 – njzk2 2014-09-30 13:51:20

+0

如果你每插入一个事务,当然会很慢。将'db.beginTransaction();'和其他东西移出内部循环和插入数据的循环。 – 2014-09-30 17:03:25

回答

-1

我不相信插入将采取太长使用的AsyncTask,但如果它正在然后即使如此,它是一个更好的方法,你正在努力实现 ..That是“在执行插入,然后什么数据库用于UI线程上的大量数据“。

  • 如果您将在UI线程上执行此长时间运行的任务,您的应用程序可能会崩溃。
  • 这就是为什么AsyncTask是为了从UI线程中带走负载的原因。
  • 如果您对设备执行插入所花费的时间非常恼火,您可以尝试另外一种方法来启动IntentService。您可以在执行其他任务时继续在后端执行工作。
+0

使用服务并不意味着您不会阻止用户界面。默认情况下,服务实例在UI线程上运行。 – 2014-09-30 14:26:08