java - 如何制作数据库复制进度对话框?

标签 java android sqlite

我有一个带有 sqlite 数据库的游戏,大小为 10MB。因此,安装游戏后,第一次游戏启动时,数据库将被复制到内存中,这需要一段时间,可能需要 30 秒,并且出现黑屏。这是非常糟糕的,因为用户可能会认为游戏卡住了。我在想,有没有办法在主菜单打开后显示如下图所示的内容,显示“正在复制数据库”或其他内容?我怎样才能做到这一点?

我正在使用以下代码从 Assets 文件夹复制我的数据库:

TestAdapter mDbHelper = new TestAdapter(this);
        DataBaseHelper myDbHelper = new DataBaseHelper(this);

        if(!myDbHelper.checkDataBase()){
        mDbHelper.createDatabase();
        }

enter image description here

最佳答案

进度条可以与asyncTask一起使用。如您所知,UI 线程 应该被保留 避免可能影响 UI 响应能力的繁重操作。现在这就是你的时候 使用工作线程。

将进度条与异步任务一起使用可以非常容易...但由于您不想要 asyncTask,这里是一个示例。

  btnStartProgress = (Button) findViewById(R.id.btnStartProgress);//the button that starts your function
    btnStartProgress.setOnClickListener(
             new OnClickListener() {

       @Override
       public void onClick(View v) {

        // prepare for a progress bar dialog
        progressBar = new ProgressDialog(v.getContext());
        progressBar.setCancelable(true);
        progressBar.setMessage("File downloading ...");
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();

        //reset progress bar status
        progressBarStatus = 0;

        //reset filesize
        fileSize = 0;

        new Thread(new Runnable() {
          public void run() {
            while (progressBarStatus < 100) {

              // process some tasks
              progressBarStatus = doSomeTasks();

              // your computer is too fast, sleep 1 second
              try {
                Thread.sleep(1000);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }

              // Update the progress bar
              progressBarHandler.post(new Runnable() {
                public void run() {
                  progressBar.setProgress(progressBarStatus);
                }
              });
            }

            // ok, file is downloaded,
            if (progressBarStatus >= 100) {

                // sleep 2 seconds, so that you can see the 100%
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // close the progress bar dialog
                progressBar.dismiss();
            }
          }
           }).start();

           }

            });

    }

// file download simulator... a really simple
public int doSomeTasks() {

    while (fileSize <= 1000000) {

        fileSize++;

        if (fileSize == 100000) {
            return 10;
        } else if (fileSize == 200000) {
            return 20;
        } else if (fileSize == 300000) {
            return 30;
        }
        // ...add your own

    }

    return 100;

}

单击此处查看 sourcecode.

编辑:

查看本教程。 Click here.

关于java - 如何制作数据库复制进度对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17299640/

相关文章:

java - 无法获得简单 Hadoop mapreduce 程序所需的输出

java - 倒数计时器显示在单独的 View 中

sql - dplyr:row_number()不适用于sql表(SQLite)

c++ - QSqlQuery 为列名 Sqlite 准备和绑定(bind)值

java - 如何声明List类型的Interface变量并直接赋值?

java - 准备 JNA 以便在 Eclipse 中使用

android - 当抽屉导航滑动任意量时隐藏操作栏菜单项

android - ROM到底是什么?

java - 将 Firebase 中的多个坐标添加到 ArrayList 中并创建折线

python sqlite3多个LEFT JOIN按列分组