2011-05-16 10 views
0

問題:Android AsyncTaskブロックバックキーディスパッチイベント

アクティビティはonStart()でAsyncTaskを開始します。 doInBackgroundメソッドで 、検索の時間後にテストを

を私は短いWebRequestクラスを作成し、ネットワークconnetionに応じて、これは少し時間がかかることがあり、私は、このタスクが解約したい...

BUT ..私はdoInBackgroundメソッド中に戻るボタンを押したときに、私のdoInBackgroundメソッドが終了した後、Keyevent istが常に送出されることに気付きました。

ユーザーがバックボタンを押したときにasynctaskがキャンセルされない理由がわからない場合は、 AsyncTask.cancel(true)が呼び出されていません.....(キャンセルしてもわからない場合でもtrue)が助けになります)

これはasynctaskとbackbuttonの通常の動作ですか?

これは正常ではありません。なぜなら、ユーザーは低速接続のアクティビティからどのように戻ってくるべきなのでしょうか?

タイムアウトを待っていますか?

私は可能なはずWebRequestクラス非同期をキャンセル、ヘルプのために物乞いしています:)

+0

おそらくAsyncTask.cancelを呼び出すコードを表示します。 –

+0

はコードが実行される方法が遅れているので役に立たない。 – VinoRosso

答えて

1

doInBackgroundメソッドでユーザーが戻るボタンを押すと、doInBackgroundメソッドが終了した後、Keyeventが常に送出されます。

いいえ、これは当てはまりません。

メインアクティビティ(サーバーからファイルをダウンロードする)でAsyncTaskが実行されているときにデバイスのBACKボタンを押すと、アクティビティはすぐに終了します。

しかし、AsyncTaskは、明示的に取り消していない限り(すでに知っている限り)、doInBackground()メソッドにあるコードを実行し続けます。私の知る限り

、あなたの「WebRequestクラス」(つまりが何であれは)など、あなたのdoInBackground()方法を阻止し、そのため、onPause()でそれをキャンセルするいかなる試みも、onStoponDestroy()され動作しません。

有利な点として、AsyncTask.cancel(...)メソッドの動作は、isCancelledが 'true'に設定されることです。 AsyncTaskのdoInBackground()メソッドを正常にキャンセルするには、isCancelledを定期的にチェックする必要があります。 DoSomething()(例えば、あなたの「WebRequestクラスは、」)whileループをブロックしている場合の例...

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

    while (!isCancelled) { 
     DoSomething(); 
    } 
} 

問題があり、それが完了するまで、その後isCancelledはチェックされません。

+0

問題は、バックボタンのKEYEVENTです。doInBackgroundメソッドが終了するまで、ボタンはディスパッチされません。私はそれをデバッグして、私はログでそれを見ることができますが、doInBackgroundはログを実行していますが、「キーイベントを送信するのを待っています」というメッセージが表示されます。これは、アクティビティのonStart()メソッドでAsynctaskを開始することと関係があります。しかし、私はどこかでAsyncTaskを起動する必要があります..... – VinoRosso

+0

@VinoRosso: "キーイベントのディスパッチ" ...ログエントリはどこに作成されますか?あなたのコードでBACKボタンイベントを「キャッチ」するのを待っている場所はどこですか? – Squonk

+0

このログエントリはアンドロイドOSから来ます。iボタンを押したときにdoInBackgroundが実行されています。私のコードでは、onKeyDownでBack Buttonイベントをキャッチします。このイベントは遅すぎる。 – VinoRosso

0

これは正常な動作です。ドキュメントは言う:

タスク

タスクをキャンセル

は(boolean)をキャンセル呼び出す ことにより、いつでもキャンセルすることができます。 このメソッドを呼び出すと、後で のisCancelled()への呼び出しがtrueを返します。 onPostExecute(Object)の代わりに onCancelled(Object)が呼び出された後、 のdoInBackground(Object [])の後に が返されます。タスクは できるだけ迅速にキャンセルされたことを確認するために、あなたは は常に(isCancelledの戻り値 をチェックする必要があります)、定期的に doInBackground(オブジェクト[])から、(例えば、ループ内。) 可能であれば