関連する質問をいくつか読みましたが、使用しているハンドラーとスレッドを使用することをお勧めしますが、このコードを実行するとまだブラックアウトし、プログレスバーが動いているのが見えず、数秒後に画面が黒くなります。しかし、そのプロセスはその後しばらくして終了しました。
コード :
public void onRunButtonClicked(View view) throws IOException
{
// prepare for a progress bar dialog
progressBarStatus = 0;
progressBar = new ProgressDialog(view.getContext());
progressBar.setCancelable(true);
progressBar.setMessage("Updating...");
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressBar.setProgress(0);
progressBar.setMax(97);
progressBar.show();
// bulk insert books
bulkInsertBooks(this.getApplicationContext());
}
private void bulkInsertBooks(final Context context) throws IOException
{
// setup progressbar
progressBar.setMax(5000);
new Thread(new Runnable()
{
public void run()
{
// delete existing rows
db.execSQL("DELETE FROM Book");
// load csv from assets
InputStream is = null;
try
{
is = context.getAssets().open("books.dat");
}
catch (IOException e)
{
e.printStackTrace();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
// now insert into db
String sql = "INSERT INTO Book VALUES (?,?,?,?,?,?);";
SQLiteStatement statement = db.compileStatement(sql);
db.beginTransaction();
String line;
try
{
while ((line = reader.readLine()) != null)
{
String[] RowData = line.split("\\|");
statement.clearBindings();
statement.bindString(1, RowData[0]);
statement.bindString(2, RowData[1]);
statement.bindString(3, RowData[2]);
statement.bindString(4, RowData[3]);
statement.bindString(5, RowData[4]);
statement.bindString(6, RowData[5]);
statement.execute();
// Update the progress bar in every iteration
progressBarHandler.post(new Runnable()
{
public void run()
{
progressBar.setProgress(progressBarStatus++);
}
});
}
}
catch (IOException e)
{
e.printStackTrace();
}
// finish
db.setTransactionSuccessful();
db.endTransaction();
if (is != null)
{
try
{
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}).start();
}