TextView在asynctask期间不显示

时间:2012-05-09 23:03:50

标签: android android-asynctask android-softkeyboard

当用户在输入中键入内容并按下回车时,我有一个搜索功能,将触发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);

}

3 个答案:

答案 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
}