問題タブ [android-asynctask]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android:AsyncTaskはUIスレッド以外のスレッドで戻ることができますか?
Androidのドキュメントによると、AsyncTaskpostExecute()
はUIスレッドで呼び出されます。postExecute()
呼び出されたスレッドから呼び出されたという印象を受けましたexecute()
。独自のスレッドを持つバックグラウンドサービスでAsyncTaskを使用しており、postExecute()はメインスレッドではなくサービススレッドで呼び出されました。
ただし、最近、postExecute()がまったく呼び出されないという問題が発生しましたが、例外がスローされました:「デッドスレッドのハンドラーにメッセージを送信する」。
正確にはどうですか:
-AsyncTaskはメインスレッドからのみ使用されますか?
-そうでない場合、どのスレッドpostExecute()
が呼び出されることになっていますか:常にUIスレッド、またはexecute()
呼び出し元のスレッド?
ありがとうございました
android - キャンセルされたAsyncTaskのonPostExecute
がキャンセルされたonPostExecute
場合は実行されますか?AsyncTask
実行された場合、他のことをする前に、タスクがisCancelled
開始時にキャンセルされたかどうか()を常に確認する必要があると言っても差し支えありonPostExecute
ませんか?
java - ProgressDialog を使用した外部 AsyncTask クラス [更新: そして戻る?]
**更新: (以下を参照)** 数日間探し回っていますが、これに対する明確な答えが見つかりません。可能だと言う人もいれば、達成できないと言う人もいます。私はこれに夢中になっています。
私が欲しいのは、 AsyncTaskTask にプログレスバーを外部クラスに表示させることだけです。これを行うには、メイン クラスでわかるようにコンテキストを渡します。しかし、私が何をしようとしても得られNullPointerException
ます。
実用的なコード例は大歓迎です。ありがとうございました
ちなみにAndroid 2.2を使用しています。
主要:
AsyncClass.java
更新: フォローアップの質問があります: 上記のコードを使用して、onPostExecute メソッドからメイン クラスに値を返すことは可能ですか? (初心者になってすみません)私はこのようなことを試しました:
次に、文字列を返すメソッド。しかし、私はそれをすることができません:
この問題に取り組むにはどうすればよいですか? ありがとう。
android - Android:Asyncを使用して.pngファイルをダウンロードし、ImageViewに設定する方法は?
ダウンロードして ImageView のソースとして設定する必要がある .png 画像の URL を取得しました。私は今のところ初心者なので、理解できないことがいくつかあります: 1) ファイルをどこに保存しますか? 2) Java コードで ImageView に設定するにはどうすればよいですか? 3) AsyncTask メソッドを正しくオーバーライドするには?
事前に感謝します。どんな種類の助けも高く評価します。
java - Activity のインスタンス変数が AsyncTask の onPostExecute に設定されていないか、AsyncTask からメイン UI スレッドにデータを返す方法
AsyncTask を作成してインターネットからデータを取得し、そのデータを取得してインテントにバンドルし、新しいアクティビティ (リスト表示) に渡す正しい方法を見つけようとしています。したがって、最初のアクティビティには EditText と Button しかありません。OnClick のイベントでは、タスクを呼び出す必要があり、タスクが完了すると、データはインテント内にバンドルされ、次のアクティビティに渡されます。問題は、onPostExecute から結果を取得し、それらをメイン アクティビティのインスタンス変数に設定すると、タスクが完了したときにそのインスタンス変数が null のままになることです。コードのベアボーン バージョンは次のとおりです。
アプリケーションをデバッグすると、onPostExecute には有効な PlacesList がすべての結果を含んでいることがわかりますが、タスクの実行後にインスタンス変数の場所が null に設定されるのはなぜですか? AsyncTask から誤って「データを返す」つもりですか?
android - AsyncTask は本当に概念的に欠陥がありますか、それとも何か不足していますか?
私はこの問題を何ヶ月も調査し、さまざまな解決策を考え出しましたが、それらはすべて大規模なハックであるため、満足していません. 設計に欠陥のあるクラスがフレームワークに組み込まれ、誰もそれについて話していないとはまだ信じられないので、何かが欠けているに違いないと思います。
問題はAsyncTask
. ドキュメントによると、
「スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UI スレッドで結果を公開できます。」
showDialog()
この例では、いくつかの例示的なメソッドが でどのように呼び出されるかを引き続き示しますonPostExecute()
。ただし、ダイアログを表示するには常に valid への参照が必要であり、 AsyncTaskはcontext object への強い参照を保持してはならないため、これは完全に不自然に思えます。Context
その理由は明らかです。タスクをトリガーしたアクティビティが破棄された場合はどうなるでしょうか。これは、画面を反転したなどの理由で、常に発生する可能性があります。タスクがそれを作成したコンテキストへの参照を保持する場合、役に立たないコンテキスト オブジェクトを保持しているだけでなく (ウィンドウは破棄され、 UI の操作はすべて例外で失敗します!)、メモリーリーク。
ここで私のロジックに欠陥がない限り、これは次のように解釈されます:onPostExecute()
コンテキストにアクセスできない場合、UI スレッドでこのメソッドを実行することは何のメリットがあるのでしょうか? ここでは意味のあることは何もできません。
回避策の 1 つは、コンテキスト インスタンスを AsyncTask に渡すのではなく、Handler
インスタンスに渡すことです。これは機能します: Handler はコンテキストとタスクを緩やかにバインドするため、リークの危険を冒すことなくそれらの間でメッセージを交換できます (そうですか?)。しかし、それは AsyncTask の前提、つまりハンドラーを気にする必要がないという前提が間違っていることを意味します。同じスレッドでメッセージを送受信しているため、Handler を悪用しているようにも見えます (UI スレッドでメッセージを作成し、UI スレッドでも実行される onPostExecute() で送信します)。
さらに、その回避策を使用しても、コンテキストが破棄されると、起動されたタスクの記録がないという問題がまだ残っています。つまり、画面の向きを変更した後など、コンテキストを再作成するときにタスクを再起動する必要があります。これは遅くて無駄です。
これに対する私の解決策 ( Droid-Fu ライブラリに実装されているWeakReference
) は、コンポーネント名から一意のアプリケーション オブジェクトの現在のインスタンスへの s のマッピングを維持することです。AsyncTask が開始されるたびに、呼び出しコンテキストがそのマップに記録され、コールバックごとに、そのマッピングから現在のコンテキスト インスタンスがフェッチされます。これにより、古いコンテキスト インスタンスを参照することがなくなり、コールバックで常に有効なコンテキストにアクセスできるため、そこで意味のある UI 作業を行うことができます。また、参照が弱く、特定のコンポーネントのインスタンスが存在しなくなるとクリアされるため、リークもありません。
それでも、これは複雑な回避策であり、Droid-Fu ライブラリ クラスの一部をサブクラス化する必要があるため、かなり煩わしいアプローチになります。
今、私は単に知りたいのです:私は何かを大幅に見逃しているのでしょうか、それとも AsyncTask は本当に完全に欠陥がありますか? あなたの経験はそれでどのように機能していますか? これらの問題をどのように解決しましたか?
ご意見ありがとうございます。
android - Android の AsyncTask の問題
Androidのヘルプページからコードを実行しようとしていますが、うまくいきません:
タスクを実行すると、doInBackground は正常に呼び出されますが、onPostExecute は呼び出されません:(
Milestone 2.1 OS でテスト済み
android - 呼び出しページを更新する PageAsyncTask endHandler
私は Microsoft の PageAsyncTask オブジェクトを強制的に適用させられましたが、これは初めてです (常に jQuery AJAX 呼び出しを使用する前に)。作業が完了して endHandler が呼び出された場合を除いて、すべてが正常に機能しています。呼び出しページの内容を更新するにはどうすればよいですか?
基本的に、私の非同期関数は多数のデータベース操作を実行し、データベースの実行結果に関する HTML を呼び出し元に報告します。操作が完了したら、これらの結果を呼び出しページに表示したいと思います。結果を表示する呼び出しページを除いて、すべてが機能しています。
あなたの助けに感謝します。
java - AsyncTask が onPreExecute を表示しない
私は 2 つの AsyncTask アクティビティを持っています。その唯一の責任は、UI スレッドで AsyncTask を実行することです。それらの 1 つはうまく機能し、progressBar を表示し、ProgressBar メッセージを更新します。これは、実際には検索アクティビティを宣言するための Google 検索メタデータを使用した検索アクティビティである、私の SearchActivity 用です。AsyncTask のクローンを作成し、doInBackground コードのみを変更し、SearchActivity のクローンを作成して、browseActivity と呼びました。
項目がクリックされたときに listView を拡張するクラスで結果を得るために、BrowseActivity を開始します。私が意図したのは、AsyncTask の onPreExecute コードが SearchActivity と同じように、ListView アクティビティと、ListView が onActivityResult を開始する ResultActivity の間に、progressBar を表示することでした。onPreExcute コードが呼び出されていますが、ProgressBar は表示されません。(UIスレッドで正しく実行したと思いましたか?)
ブラウズ アクティビティは次のとおりです。
以下は、browseActivity が開始される CategoryActivity (ListActivity を拡張) アクティビティです。
android - 別のスレッドを使用して http 要求を実行する方法
ユーザーが特定のボタンをクリックしたときに HTTP 要求を実行する (具体的には FogBugz API を呼び出す) アプリケーションがあります。現在、アプリケーションの起動時にサービスを作成し、そのサービスでさまざまなメソッドを呼び出してリクエストを完了しています。ただし、これを行うと、UI スレッドで通常のハングが発生します。私は AsyncTask を見てきましたが、それが私が達成したいことをするかどうかはわかりません。HTTP 要求が返す XML を即座に解析する必要があるため、このデータを UI スレッドに返すことができるプロセスが必要です。ASyncTask はこれを達成できますか、それとも他の方法がありますか?
このメソッドは、HttpRequests を実行するために他のいくつかによって呼び出されます。入力ストリームが返されると、他のメソッドが特定の情報を解析します。