Android 异步任务期间未显示文本视图
我有一个搜索功能,当用户在输入中键入某些内容并按enter键时,将触发一个异步任务来检索结果。我希望在asynctask运行前/运行时显示我的文本视图(visibility=gone),其中显示“加载”。但是,它仅显示加载文本一秒钟,然后在postExecute中显示结果。因此,在asynctask运行的几秒钟内,我没有看到加载文本。有人知道为什么吗 正如您在我的代码中看到的,我已经将加载文本设置为在asynctask运行之前和在asynctask中预执行期间可见,这两种设置都不能解决问题 编辑是我的编辑文本,检索是我的“加载”文本视图 以下是我的EditText keylistener:Android 异步任务期间未显示文本视图,android,android-asynctask,android-softkeyboard,Android,Android Asynctask,Android Softkeyboard,我有一个搜索功能,当用户在输入中键入某些内容并按enter键时,将触发一个异步任务来检索结果。我希望在asynctask运行前/运行时显示我的文本视图(visibility=gone),其中显示“加载”。但是,它仅显示加载文本一秒钟,然后在postExecute中显示结果。因此,在asynctask运行的几秒钟内,我没有看到加载文本。有人知道为什么吗 正如您在我的代码中看到的,我已经将加载文本设置为在asynctask运行之前和在asynctask中预执行期间可见,这两种设置都不能解决问题 编辑
edit.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_ENTER:
retrieving.setVisibility(View.VISIBLE);
SearchTask task = (SearchTask) new SearchTask(edit,retrieving);
task.execute(edit.getText().toString());
try {
task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
break;
}
}
return false;
}
});
以下是异步任务:
公共类SearchTask扩展了AsyncTask{
private EditText edit;
private TextView retrieving;
public SearchTask(EditText edit,TextView retreiving, ) {
this.edit = edit;
this.retrieving = retreiving;
}
@Override
protected void onPreExecute() {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
retrieving.setVisibility(View.VISIBLE);
}
@Override
protected Playlist doInBackground(String... params) {
//download and parse xml
}
@Override
protected void onPostExecute(Playlist playlist) {
retrieving.setVisibility(View.GONE);
}
在
检索.setVisibility(View.VISIBLE);
键入检索.invalidate();
这会告诉ui重新绘制视图
如果出于某种原因,该类型不起作用:
(new Handler()).post (new Runnable() { public void run() { retrieving.invalidate(); } });
最后,如果上述方法无效,请尝试:
(new Handler()).post (new Runnable() { public void run() { retrieving.setVisibility(View.VISIBLE); } });
在
检索.setVisibility(View.VISIBLE);
键入检索.invalidate();
这会告诉ui重新绘制视图
如果出于某种原因,该类型不起作用:
(new Handler()).post (new Runnable() { public void run() { retrieving.invalidate(); } });
最后,如果上述方法无效,请尝试:
(new Handler()).post (new Runnable() { public void run() { retrieving.setVisibility(View.VISIBLE); } });
为什么不在完成后台工作后调用publishProgress()更新与UI相关的内容 这样就可以确保您以正确的方式调用UI线程,并正确地重新排列视图 像这样的
@Override
protected Playlist doInBackground(String... params) {
//download and parse xml
publishProgress();
}
protected void onProgressUpdate(Integer... progress) {
//Do your UI Related Stuff Here
}
为什么不在完成后台工作后调用publishProgress()更新与UI相关的内容 这样就可以确保您以正确的方式调用UI线程,并正确地重新排列视图 像这样的
@Override
protected Playlist doInBackground(String... params) {
//download and parse xml
publishProgress();
}
protected void onProgressUpdate(Integer... progress) {
//Do your UI Related Stuff Here
}
好的,我进一步阅读了您的代码,发现了问题所在。您的
task.get()
命令正在锁定您的UI。因此,在被task.get()阻止之前,您的onPreExecute永远不会运行任何更改
您应该完全删除该代码块,并在异步任务的onPostExecute()方法中执行任何需要执行的操作
例如:
@Override
protected void onPostExecute(Playlist playlist) {
retrieving.setVisibility(View.GONE);
// do something with playist here. Play store it, etc...
}
好的,我进一步阅读了您的代码,发现了问题所在。您的
task.get()
命令正在锁定您的UI。因此,在被task.get()阻止之前,您的onPreExecute永远不会运行任何更改
您应该完全删除该代码块,并在异步任务的onPostExecute()方法中执行任何需要执行的操作
例如:
@Override
protected void onPostExecute(Playlist playlist) {
retrieving.setVisibility(View.GONE);
// do something with playist here. Play store it, etc...
}
放置
retrieving.setVisibility(View.VISIBLE);
在其中不起作用放置retrieving.setVisibility(View.VISIBLE);
在其中不起作用它们应该在异步onPreExecute()方法中它们应该在异步onPreExecute()方法中谢谢,task.get()是问题所在。谢谢,task.get()是问题所在。