当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《progressDialog动画在大型setText()上暂停》经验,为你挑选了1个好方法。

我正在尝试在EditText中设置一个大文本,操作可能需要30秒以上,所以我使用ProgressDialog.它显示,但没有动画,然后在操作完成后消失.这是我的简化代码:

class FileOpener extends AsyncTask {

    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速度的问题,这是我理解的可怕.这个问题就在这里.无论我如何提高速度,设置文本总是需要几秒钟的大文件,它甚至没有顶级编辑应用程序.这个问题的真正含义是如何保持加载对话框动画,因为目前在EditText中设置文本时它没有动画.我知道如果不在UI线程中,UI上什么都不能改变,那么如何更新/动画加载呢?如果这是不可能的,或者只是太复杂或太乱,那么在设置文本时如何显示任何类型的加载动画.



1> petey..:

您应该能够通过创建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 {

        @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!

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有