2012-05-09 10 views
0

ユーザーが入力に何かを入力してEnterキーを押すと、検索機能があり、asynctaskは結果を取得するために起動します。 asynctaskが実行されている間に、/読み込まれていることを表示するtextview(visibility = gone)が必要です。ただし、postExecuteで結果を表示する前に、読み込み中のテキストを1秒間だけ表示します。だから、数秒間にasynctaskが実行されていますが、ロードテキストは表示されません。なぜ誰が知っていますか?asynctask中にTextViewが表示されない

私のコードでわかるように、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です:

パブリッククラス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

OKのような

何かが私はさらにあなたのコードを読んで、私はこの問題を参照してください。 task.get()コマンドがUIをロックしています。したがって、あなたのonPreExecuteは、task.get()によってブロックされる前に、実行するように変更されることはありません。

非同期タスクのonPostExecute()メソッドで、そのブロックを完全に削除し、実行する必要があるものはすべて実行してください。例えば

:それらの

@Override 
protected void onPostExecute(Playlist playlist) { 

    retrieving.setVisibility(View.GONE); 
    // do something with playist here. Play store it, etc... 
} 
+0

ありがとう、task.get()問題でした。 – heero

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

なしのKeyListenerもasynctask – heero

+0

どちらで働いていない彼らは(preExecute – Kyle

+0

あなたの非同期onPreExecute()メソッドにする必要がありますView.VISIBLE); 'そこでは動作しません – heero

0

なぜあなたはあなたのUI関連のものを更新しないのですか?(後でpublishProgressあなたはあなたのバックグラウンドジョブを完了しましたか?

このようにして、適切な方法でUIスレッドを呼び出し、ビューを適切に再配置することが保証されます。この

@Override 
protected Playlist doInBackground(String... params) { 

//download and parse xml 
publishProgress(); 

} 

protected void onProgressUpdate(Integer... progress) { 
    //Do your UI Related Stuff Here 
} 
+0

のもの3作品の屋どれも 'retrieving.setVisibilityを置くん – heero

関連する問題