当用户在输入中键入内容并按下回车时,我有一个搜索功能,将触发asynctask以检索结果。我想要我的textview(visibility = gone),它表示在asynctask运行之前/期间显示“正在加载”。但是,它只显示加载文本一秒钟,然后在postExecute中显示结果。因此,在asynctask运行的几秒钟内,我没有看到加载文本。有谁知道为什么?
正如您在我的代码中所看到的,我已经将加载文本设置为在asynctask运行之前以及在asynctask中的preExecute期间可见,并且都没有解决问题。
编辑是我的EditText,检索是我的“加载”TextView
这是我的EditText keylistener:
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;
}
});
这是asynctask:
public class 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);
}
答案 0 :(得分:3)
好的,我进一步阅读你的代码,我看到了问题。您的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...
}
答案 1 :(得分:0)
retrieving.setVisibility(View.VISIBLE);
之后
输入retrieving.invalidate();
这告诉ui重绘视图
如果由于某种原因无效,请输入:
(new Handler()).post (new Runnable() { public void run() { retrieving.invalidate(); } });
最后,如果上述方法不起作用,请尝试:
(new Handler()).post (new Runnable() { public void run() { retrieving.setVisibility(View.VISIBLE); } });
答案 2 :(得分:0)
为什么在完成后台工作后调用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
}