我正在尝试在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上什么都不能改变,那么如何更新/动画加载呢?如果这是不可能的,或者只是太复杂或太乱,那么在设置文本时如何显示任何类型的加载动画.
您应该能够通过创建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!