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

Posted

技术标签:

【中文标题】progressDialog 动画在大型 setText() 上暂停【英文标题】:progressDialog animations pauses on large setText() 【发布时间】:2017-01-21 20:05:01 【问题描述】:

我正在尝试在 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();

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

【问题讨论】:

在AsyncTask中有一个函数叫onProgressUpdate()。然后在您的readFile() 中,致电publishProgress(yourValue) 实际上最耗时的是设置文本。读取文件可能需要 1 秒,而设置文本可能需要 30 秒。而且我真的不能在 setText 中调用这个函数... 哦,我明白了,您可以在readFile() 之后直接尝试setText,在runOnUiThread() 中,然后在PostExecute() 中关闭您的对话框。要调用runOnUiThread(),您需要一个活动。 如何在EditText 上设置String 需要超过1ms? @RaphaelTeyssandier 不,这样做时对话框会在设置文本之前被关闭。 【参考方案1】:

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

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)

结果是动画永远不会停止,但是有一个短暂的时刻(

HTH!

【讨论】:

测试是在 kindle fire hd 8 上进行的 还没试过,doInBackground中设置的文字没有阻止动画? >但是在 doInBackground 中设置的文字没有阻止动画吗?在我上面的例子中,没有。 @NicolasMaltais,请接受这个正确答案。当人们有足够的时间来解决您的问题并帮助您时,您应该接受正确的答案并及时兑现承诺(赏金)。 @petey 好的,我只是按照您的建议进行了操作:有时进度对话框甚至没有显示,当显示时,加载没有动画,它会阻塞。知道为什么吗?

以上是关于progressDialog 动画在大型 setText() 上暂停的主要内容,如果未能解决你的问题,请参考以下文章

转Android ProgressDialog的使用

Android操作系统中默认的loading动画怎么调用

Android:如何在给定网址的情况下显示大型动画 gif?

js动画效果

如何为大型网格实现 VBO 并获得流畅的动画?

测试Animation大型动画文件拆分播放的可行性