我试图在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和变体以及一些代码注释:
通过创建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,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字节
设置为一个字符串值50kb然后创建另一个字符串非常懒惰并将其设置为新的编辑文本(而不是您的readFile()):
String all = fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb; newEditText.setText(all)
结果是动画永远不会停止,但是有一个短暂的时间(<1秒),编辑文本是空白的,然后显示所有文本并且是可编辑的. HTHS!