android - progressDialog 动画在大型 setText() 上暂停

标签 android multithreading android-edittext

我试图在 EditText 中设置大文本,该操作可能需要 30 多秒,所以我使用 ProgressDialog。它出现了,但没有动画,然后在操作完成后消失。这是我的简化代码:

class FileOpener extends AsyncTask<File, Integer, String> {

    private ProgressDialog progress;

    @Override
    protected void onPreExecute() {
        progress = new ProgressDialog(context);
        ...
        progress.show();
    }

    @Override
    protected StringBuilder doInBackground(File... files) {
        return readFile();
    }


    @Override
    protected void onPostExecute(String content) {
        EditText editText = ...
        editText.post(new Runnable() {
            @Override
            public void run() {
                editText.setText(content);
                progress.dismiss();
            }
        });
    }
}

如何在设置文本时使进度对话框动画化?

我也试过在 onPostExecute 中使用它,同样的事情,对话框在那里但没有动画...

EditText editText = ...
new Thread() {
    @Override
    public void run() {
        editor.setText(content);
        progress.dismiss();
    }
}.start();

编辑 - 这不是关于我的 EditText 速度的问题,据我所知,这很糟糕。这个问题是here .无论我如何提高速度,设置文本对于大文件总是需要几秒钟,即使是顶级编辑应用程序也不需要。这个问题真正是关于如何保持加载对话框动画,因为目前,在 EditText 中设置文本时它不会动画。我不知道如果不是在 UI 线程中,UI 上什么都不能改变,那么我该如何更新/动画加载?如果这是不可能的,或者太复杂或太麻烦,那么我该如何在设置文本时显示任何类型的加载动画。

最佳答案

你应该能够最小化动画暂停/停止 通过创建一个 EditText 并在您的 doInBackground 中设置其文本并将其添加到您的 onPostExecute(ui 线程)中查看。下面是一个使用 Activity 和您已有的任务变体以及一些代码注释的示例:

public class Activity extends AppCompatActivity {

    /**
     * dummy edit text (or the old one if doing an update)
     */
    private EditText dummyEditTextForShow;
    /**
     * that dummy's parent
     */
    private ViewGroup viewGroupToAddEditTextTo;
    /**
     * that dummy's position in it's parent
     */
    int indexOfDummy;
    /**
     * your progress dialog
     */
    private ProgressDialog progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // create the things
        progress = new ProgressDialog(this);
        dummyEditTextForShow = new EditText(this);
        // show the place holder
        setContentView(dummyEditTextForShow);
        // get its parent and index in parent
        viewGroupToAddEditTextTo = (ViewGroup) dummyEditTextForShow.getParent();
        indexOfDummy = viewGroupToAddEditTextTo.indexOfChild(dummyEditTextForShow);
        new FileOpener().execute();
    }

    class FileOpener extends AsyncTask<File, Integer, EditText> {

        @Override
        protected void onPreExecute() {
            progress.show();
        }
        @Override
        protected EditText doInBackground(File... files) {
            EditText newEditText = new EditText(Activity.this);
            newEditText.setText(readFile());
            return newEditText;
        }

        @Override
        protected void onPostExecute(EditText editText) {
            //get rid of old for the new
            ViewGroup.LayoutParams oldLayoutParams = dummyEditTextForShow.getLayoutParams();
            viewGroupToAddEditTextTo.removeView(dummyEditTextForShow);
            viewGroupToAddEditTextTo.addView(editText, indexOfDummy, oldLayoutParams));
            progress.hide();
            dummyEditTextForShow = editText
        }
    }
}

我使用 http://www.webpagefx.com/tools/lorem-ipsum-generator/loremipsum/paragraphs 测试了上面的内容 段落数:100 大小:46929字节

设置为一个字符串值 fiftykb 然后非常懒惰地创建另一个字符串 all 并将其设置为新的编辑文本(而不是你的 readFile()):

String all = fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb;
newEditText.setText(all)

结果是动画永远不会停止,但是有一个短暂的时刻(< 1 秒)编辑文本是空白的,然后显示所有文本并且是可编辑的。

HTHs!

关于android - progressDialog 动画在大型 setText() 上暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41783913/

相关文章:

android - 在 android 上从摄像头进行 OpenCV 处理和写入视频的最快方法?

android - Edittext 轮廓框不可见

android - Edittext 导致 stackoverflow

java - 在java中加入线程

java - 如何将 EditText 输入添加到变量浮点中?

android - 如何在 Android 中以编程方式插入 'profile' 联系人?

Android 工具栏选项卡

java - android-studio java.lang.NullPointerException onPostExecute应用程序在电话不在模拟器上崩溃

c++ - 卡在 _dl_sysinfo_int80 上的多线程应用程序

c# - Func<> 和原始代码