android UI冻结并读取数据时线程被阻塞

问题描述

我有使用BufferedReader和realm.io读取文本行的代码

realm.beginTransaction();
BufferedReader reader;
while ((strLineText = reader.readLine()) != null) {
    lineNumber++;
    LineData managedLineData = realm.copyToRealm(lineData);
    contentDataRealm.chatDataList.add(managedLineData);
    tvProgress.setText(getString(R.string.text_progress,lineNumber * 100 / totalLine));
    pbProgress.setProgress(lineNumber * maxProgress / totalLine);
}

进度栏仍为0,文本视图未更新。我尝试使用ui线程,但仍然遇到相同的问题。

realm.beginTransaction();
while ((strLineText = reader.readLine()) != null) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            lineNumber++;
            LineData managedLineData = realm.copyToRealm(lineData);
            contentDataRealm.chatDataList.add(managedLineData);
            tvProgress.setText(getString(R.string.text_progress,lineNumber * 100 / contentSize));
            pbProgress.setProgress(lineNumber * maxProgress / contentSize);
        }
    });
}

与此同时

realm.beginTransaction();
while ((strLineText = reader.readLine()) != null) {
    tvProgress.post(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    lineNumber++;
                    LineData managedLineData = realm.copyToRealm(lineData);
                    contentDataRealm.chatDataList.add(managedLineData);
                    tvProgress.setText(getString(R.string.text_progress,lineNumber * 100 / contentSize));
                    pbProgress.setProgress(lineNumber * maxProgress / contentSize);
                }
            });
        }
    });
}

然后,我决定使用不确定对象,并确定我的加载动画已停止。我尝试使用后延迟,仅在阅读开始之前加载动画工作

handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        readContent(); // reading text from BufferedReader
    }
},1000);

我错过了什么吗?

解决方法

尝试将工作流程分为两部分:

  1. 读取数据库->创建文本对象(使用StringBuilder或StringBuffer,尝试做出正确选择)。这部分应该在后台任务中工作。

  2. 更新用户界面。这部分应该在主线程上运行。

重要说明:请不要忘记活动/片段的生命周期。