Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 异步任务期间未显示文本视图_Android_Android Asynctask_Android Softkeyboard - Fatal编程技术网

Android 异步任务期间未显示文本视图

Android 异步任务期间未显示文本视图,android,android-asynctask,android-softkeyboard,Android,Android Asynctask,Android Softkeyboard,我有一个搜索功能,当用户在输入中键入某些内容并按enter键时,将触发一个异步任务来检索结果。我希望在asynctask运行前/运行时显示我的文本视图(visibility=gone),其中显示“加载”。但是,它仅显示加载文本一秒钟,然后在postExecute中显示结果。因此,在asynctask运行的几秒钟内,我没有看到加载文本。有人知道为什么吗 正如您在我的代码中看到的,我已经将加载文本设置为在asynctask运行之前和在asynctask中预执行期间可见,这两种设置都不能解决问题 编辑

我有一个搜索功能,当用户在输入中键入某些内容并按enter键时,将触发一个异步任务来检索结果。我希望在asynctask运行前/运行时显示我的文本视图(visibility=gone),其中显示“加载”。但是,它仅显示加载文本一秒钟,然后在postExecute中显示结果。因此,在asynctask运行的几秒钟内,我没有看到加载文本。有人知道为什么吗

正如您在我的代码中看到的,我已经将加载文本设置为在asynctask运行之前和在asynctask中预执行期间可见,这两种设置都不能解决问题

编辑是我的编辑文本,检索是我的“加载”文本视图

以下是我的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;
            }
        });
以下是异步任务:

公共类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()是问题所在。