問題タブ [serviceconnection]
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 サービスからリストビュー項目をロードするとハングアップする
私の Android アプリケーションには、ListActivity があります。この ListActivity は、サービスの項目を入力する SimpleAdapter を使用します。したがって、私のコードでは、次のようにします。
この操作全体にかかる時間はほとんどない (1 秒未満) ため、UI スレッドで実行したいと考えています。私のonCreateを参照してください:
これを UI スレッドで実行したい理由は、リスト項目を選択した場合、または ListView の特定の位置までスクロールした場合に、デバイスを回転させたり、キーボードなどを取り出したり (構成をトリガーするため) するためです。変更) アクティビティが再開されると、Android は onCreate の直後に状態を復元しようとします。しかし、別のスレッドで実行すると、そうではありません。また、クールなフェードイン アニメーションもあります :)
UI スレッドで実行する際の問題は、サービスにバインドしようとすると、そのサービス バインド リクエストがメッセージ キューに入れられることです。しかし、ループに入ると、メッセージ キューのループを停止します。サービスがバインドされるのを待っているため、プログラムがハングし、ループが終了するまでサービスはバインドされません。私は置くことを考えましたLooper.loop()
私のループの中で、しかしそれはただそれをハングアップさせます
(Looper.loop()
理由はわかりません)
。
android - アクティビティServiceConnection がリークしましたもともとここにバインドされていた @438030a8
私は最初の Android アプリに取り組んでいます。アプリには 3 つのアクティビティがあり、ユーザーはかなり頻繁に切り替えます。また、telnet 接続を処理するリモート サービスもあります。アプリは、telnet メッセージを送受信するために、このサービスにバインドする必要があります。
編集
有益な回答をありがとうBDLS。bindService()
スタンドアロン関数として使用する場合使用する場合の違いに関する説明を踏まえて、コードを書き直しましたstartService()
。戻るボタンを使用してアクティビティ間を循環すると、断続的にのみリーク エラー メッセージが表示されるようになりました。
私の接続アクティビティには次のものがonCreate()
ありonDestroy()
ます。
そのため、アクティビティが開始されるとサービスが開始され、telnet 接続が成功しなかった場合にアクティビティが破棄されるとサービスが停止されます ( connectStatus == 0
)。他のアクティビティは、接続が成功した場合にのみサービスにバインドされます ( connectStatus == 1
、共有設定に保存されます)。ここに彼らのonResume()
とがありonDestroy()
ます:
onResume()
そのため、接続アクティビティから変更された状態を取得するためにバインドが発生しonDestroy()
、必要に応じて関数内でバインドが解除されます。
編集を終了
しかし、アクティビティを切り替えると、「アクティビティが元々ここにバインドされていた ServiceConnection @438030a8 をリークしました」というメモリ リーク エラー メッセージが断続的に表示されます。私は何を間違っていますか?
ヒントや指針を事前にありがとう!!!
完全なエラー メッセージは次のとおりです (改訂されたコードから)。
2 回目の bdls を編集していただき、ご提案いただきありがとうございます。あなたが提案したonUnBind()
ように、サービスにオーバーライドを追加しました。 onUnBind()
実際には、すべてのクライアントがサービスから切断されたときにのみトリガーされますが、ホームボタンを押すと実行され、エラーメッセージがポップアップしました! すべてのクライアントがサービスからバインド解除されているため、これは私には意味がありません。見てみな:
が呼び出されたときにサービスへのバインディングが完了していない、あなたが言ったようなものかもしれないと思いましたがunbindService()
、バインディングが完了していることを確認するために各アクティビティをバックして、サービスのメソッドを呼び出してみました。元気に。
一般に、この行動は、私が各アクティビティにどれだけ長く滞在しているかとは関係がないようです。ただし、最初のアクティビティがその serviceConnection をリークすると、その後はすべて戻ってきます。
もう 1 つ、Dev Tools で [アクティビティを直ちに破棄する] をオンにすると、このエラーが回避されます。
何か案は?
java - ServiceConnection コールバックに使用されるスレッド (Android)
ローカル サービスにバインドするアクティビティを開発しています (アクティビティの onCreate 内):
ライフサイクル メソッドで IBinder を介してメソッドを呼び出せるようにしたいと考えていますが、これらのメソッドの前に onServiceConnected が呼び出されていることを確認できません。接続が確立されるとメソッド呼び出し (コマンド パターン) が実行されるように、ServiceConnection 実装に並べ替えのキューを追加することでこれを処理することを考えています。
私の質問は次のとおりです。
- これはばかげていますか、より良い方法はありますか?:)
- ServiceConnection コールバックの実行に使用されるスレッドの仕様はありますか? さらに言えば、キューのデータ構造の同期について心配する必要はありますか?
編集 - 次のようなもの:
android - Android サービスが実際に接続されるまで待つにはどうすればよいですか?
IDownloaderService.aidl で定義されたサービスを呼び出すアクティビティがあります。
Downloader.onCreate(Bundle) で bindService を試みました
ServiceConnectionオブジェクトsc内でこれを行いました
すべての種類の Log.xx を追加することで、 if(bindService(...)) の後のコードが実際に ServiceConnection.onServiceConnected が呼び出される前、つまり、ダウンローダーがまだ null のときに発生することがわかりました。これにより、問題が発生します。ApiDemos のすべてのサンプルは、ユーザー アクションによってトリガーされたときにのみサービスを呼び出すことで、このタイミングの問題を回避しています。しかし、 bindService が成功した後、このサービスを正しく使用するにはどうすればよいですか? ServiceConnection.onServiceConnected が確実に呼び出されるのを待つにはどうすればよいですか?
関連する別の質問。すべてのイベント ハンドラー: Activity.onCreate、任意の View.onClickListener.onClick、ServiceConnection.onServiceConnected などは実際に同じスレッドで呼び出されていますか (ドキュメントでは「メイン スレッド」として言及されています)。それらの間にインターリーブがありますか、または Android はすべてのイベントが 1 つずつ処理されるようにスケジュールしますか? または、 ServiceConnection.onServiceConnected が実際に呼び出されるのはいつですか? Activity.onCreate の完了時、または A.oC がまだ実行中のときですか?
android - Android サービスの unbindService と stopService の両方を呼び出す必要がありますか?
私の Android アプリでは、 と の両方を呼び出しstartService
ますbindService
。
後で、両方のunbindService and
stopService` を試みます:
ただし、への呼び出しで例外が発生しますunbindService
。この呼び出しを削除すると、アプリはstopService
呼び出しを介して適切に実行されるようです。
私は何か間違ったことをしていますか?通話は通話に関連付ける必要があり、通話は通話bindService
に関連付ける必要があると考えていました。ただし、ここではそうではないようです。unbindService
startService
stopService
android - IMediaPlaybackServiceの設定
IMediaPlaybackService
Android用に問題があります。パッケージ(この場合は)に配置するだけでよいと言われていますが、これcom.android.music
を行うとプロジェクトをビルドできません。IMediaPlaybackServiceのコードは次のとおりです。
ただし、このファイルを使用してプロジェクトをビルドできないいくつかの問題があるようです。
- 「in」キーワードが原因で、Eclipseでエラーが発生します。正確なエラーは次のとおり
Syntax error on token "long", delete this token.
です。「in」キーワードがそこにある理由がわかりません。それらはJavaのキーワードではないようですが、何ですか? - 発生する別のエラーはです
The type com.android.music.IMediaPlaybackService is not visible
。これは、インターフェイスをパブリックにすることで修正されます。 - 最後のエラーは
Stub cannot be resolved or is not a field.
、このコード行を実行したときですthis.mService = IMediaPlaybackService.Stub.asInterface(service);
。IMediaPlaybackServiceにスタブがないためです。
他の人はこれらの問題を簡単に克服できたようですが、私は何が欠けていますか?見たことがないような単純なことかもしれませんが、私はこれに必要以上に長い間取り組んできました。プロジェクトの設定を台無しにする必要がありますか?
プロジェクトをビルドすることはできましたが、サービス自体に問題があります。MediaPlayerServiceConnectionクラスのコードは次のとおりです。
...これがサービスをバインドするアクティビティのコードですが、onServiceConnectedメソッドが呼び出されていません。サービスを誤って使用しようとしていますか?
java - AndroidProgressDialogは回転しません
これは私の最初のstackoverflowポストですので、私に優しくしてください!私がやろうとしていることは可能であると確信しており、問題を引き起こしているのは私が行った(または行っていない?)ことです...私はそれが何であるかがわかりません。
私がやろうとしていること:
アプリがダウンロードされたデータを同期して処理している間、ProgressDialogを表示します。
問題:
ProgressDialogは表示されますが、回転しません(これにより、フリーズしたように見えます)。同期と処理が行われ、ProgressDialogが閉じ、アプリは通常どおり続行します。
現在どのようにそれを実行しようとしていますか:
ProgressDialogを作成します-アクティビティ
で同期を実行します-サービス
でデータを処理します-サービス
でProgressDialogを破棄します-アクティビティで
私が試したこと:
スレッドの使用(以下のコード)AsynTaskの使用(必要に応じてコードを提供できます)ハンドラーの使用(必要に応じてコードを提供できます)
私の質問に対する答えを探すのに多くの時間を費やした後、他の人が同じまたは同様の問題を抱えていて、上記のアイデアの1つを使用してそれを解決することができたようです。しかし、私は特定の問題を解決するためにこれらのアイデアを実装することができませんでした。これは私が間違っていることであると私に確信させます...私はただ何がわからないのです。
私が作成し、試行したすべての修正の基礎として使用している元のコード:
最初に
それから
だから今私はdoBindが別のスレッドで起こっていると仮定してUIスレッドをProgressDialogueを表示する以外に何もすることはありません...?
この問題についてサポートが必要な場合は、お知らせください。
編集:
代わりにハンドラーを使用するために使用しているコードは次のとおりです。これは、以前と同じ動作(スピナーは回転しません)を表示します。
。
。
android - 向きの変更によるAndroidでのServiceConnectionの維持
サービスへのServiceConnectionを保持するアクティビティがあります。向きが変わると、ServiceConnectionが失われたように見え、再作成されます。
これは望ましくありません。アクティビティの再作成を通じてServiceConnectionが維持されるようにしたいと思います。この問題を解決する良いパターンを探しています。
android - AlertDialog で Service を開始し、外部の Activity をそれにバインドする
まず、この ans を検索しようとしましたが、失敗しました。私の質問がすでに回答されている場合、誰かが私にそれを指摘してもらえますか? これを見て、またはこれをざっと読んで正しい方向に向けてくれたことで、ここで私を助けてくれてありがとう. 本当に感謝しています!
私のジレンマ:私にはアクティビティがあり、そのアクティビティにはリストビューがあります。リストビューには、AlertDialog を呼び出す必要がある複数の項目が含まれています。AlertDialog は、「データを更新する必要があります」というサービスを呼び出します。Service はリッスンし、更新を正常に実行します。
発生する問題は、私のアクティビティがサービスを認識しないことです。私が疑問に思っているのは、サービスがどのように動作するか、および同じサービスを複数回スピンアップ/実行できるかどうかを完全には理解していないということです。
私の例は、 The Android Dev Reference for Serviceの考え方に多少関連していることに注意してください。
例:
RefreshConnector :
UpdateService
DescriptionDialog が切り捨てられました (コンストラクター)。また、これは AlertDialog.Builder クラスから拡張されています。また、基本的に_contextを保存するすべてのダイアログで共通のクラスもあります。したがって、この場合、コンテキストはスーパーに保存されます。_context は保護されています ...
ここでも、ポップアップが発生する前に行われるバインドに注意してください。2 つ目は、バインディングでサービスを開始していることに注意してください。私が間違っていること、または得られないことは何ですか?
ありがとう、ケリー
android - Android アプリ、SMS/テキスト読み上げ (serviceConnection が流出)
このアプリケーションで着信メッセージをリッスンし、読み上げます。問題は、終了時に次のエラーが表示されることです
12-21 15:45:29.949: E/ActivityThread(566): アクティビティ mo.rach.collaboration.speaker が ServiceConnection android.speech.tts.TextToSpeech$Connection@41397858 をリークしました。
基本的にはバックグラウンドで実行して、アプリを閉じてもメッセージが読み上げられるようにしたいと考えています。これはプロジェクトの提出日なので、9 日に大学に戻る前に、これを把握する必要があります。
smsReceiver.java
スピーカー.java