0

ユーザーが入力に何かを入力してEnterキーを押すと、検索機能があり、非同期タスクが起動して結果を取得します。asynctask の実行前/実行中に、「読み込み中」と表示されるテキストビュー (visibility=gone) が必要です。ただし、postExecute で結果を表示する前に、ローディング テキストを 1 秒間表示するだけです。そのため、asynctask が実行されている数秒間、読み込み中のテキストは表示されません。誰かが理由を知っていますか?

私のコードでわかるように、asynctask の実行前と asynctask の preExecute 中に読み込みテキストが表示されるように設定しましたが、どちらも問題を解決しません。

編集は私のEditText、取得は私の「読み込み」TextViewです

ここに私の EditText キーリスナーがあります:

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;
            }
        });

非同期タスクは次のとおりです。

public class SearchTask extends 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);

}
4

3 に答える 3

3

OK、あなたのコードをさらに読んで、問題を見つけました。コマンドがUItask.get()をロックしています。したがって、onPreExecute は、task.get() によってブロックされる前に実行する変更がありません。

そのコード ブロックを完全に削除し、非同期タスクの onPostExecute() メソッドで実行する必要があることをすべて実行する必要があります。

例えば:

@Override
protected void onPostExecute(Playlist playlist) {

    retrieving.setVisibility(View.GONE);
    // do something with playist here. Play store it, etc...
}
于 2012-05-10T00:05:39.930 に答える
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); } });
于 2012-05-09T23:20:07.377 に答える
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
}
于 2012-05-09T23:30:09.227 に答える