我正在尝试在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上什么都不能改变,那么如何更新/动画加载呢?如果这是不可能的,或者只是太复杂或太乱,那么在设置文本时如何显示任何类型的加载动画。
答案 0 :(得分:5)
您应该能够最小化动画暂停/停止
通过创建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!