0

ボタンをActivity押すとG​​etterという名前の他のクラスが開始され、Getterクラスが1〜60 000のスレッド(ネットワーク関連の処理を行う)を作成するため、すべてが完了するまでに時間がかかることがわかりました。私の問題は、これらのスレッドの実行中にデバイスを回転させると、プログラムが正しく機能しなくなることです。私のメインアクティビティには、2秒ごとにGetterクラスから配列を取得し、それらの値をローカル配列リストに配置するハンドラーがあります。

私はこの解決策を試しました:

バックグラウンドタスク、進行状況ダイアログ、向きの変更-100%機能するソリューションはありますか?

しかし、それは非常に複雑であることがわかりました。だから今、私は私の問題に他の解決策があるかどうか疑問に思っています。たとえば、向きが変わってもスレッドはバックグラウンドで実行し続けることができますか?それが不可能な場合は、ボタンを押す直前の方向にプログラムでロックし、スレッドが完了するまで待ってから、センサーに合わせて方向を再度設定できますか?

4

2 に答える 2

0

向きをロックできます

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

https://stackoverflow.com/a/3611554/1008278を参照してください

于 2012-08-15T19:34:15.220 に答える
0

これを処理する方法は、スティッキーから非同期タスクを開始し、非同期タスクapp.Serviceが親サービスと通信できるようにすることです。親サービスは、BroadcastReceiverフレームワークを介してブロードキャストイベントをリッスンしているすべてのユーザーと通信します。ここでこのメカニズムについて説明しました。

向きを変えると、あなたapp.Activityは破壊されますが、バックグラウンドサービスは破壊されません(onLowMemory他の無数の状況になる可能性がありますが、おそらくそうではありません)。アクティビティを再作成すると、ここに投稿したソリューションを介してサービスがまだ実行されているかどうかを確認できます。その結果に基づいて、UIの処理方法を決定したり、進行状況ダイアログなどを再表示/再追加したり、受信者を再登録してサービスからのイベントをリッスンしたりできます。

これらのレイヤー間の責任は次のように機能します。

  1. AsyncTask
    • 仕事をします。
    • イベントを発生させることによって、それが何をしているのか、いつ行われたのかを報告します(Intents
    • それでおしまい
  2. サービス
    • AsyncTaskのオリエンテーションを認識しないコンテナをホストします
    • #onCreateのAsyncTaskから発生するイベントのリスナーを登録します
    • #onStartCommandでAsyncTaskを実行します
    • stopSelf()AsyncTaskから「Ihavefinished」イベントを受信すると自動的に停止します(を参照)。
    • 聞いている人に進捗状況を説明するイベントを発生させます
  3. アクティビティ
    • サービスを開始し、サービスがAsyncTaskを開始します。
    • サービスから発生するイベントのリスナーを#onCreateに登録します
    • onCreate中にサービスがすでに実行されているかどうかを確認して、作業が進行中であるか、開始する必要があるかを判断します。

個別の混乱しない役割を持つ3つの要素。それが私たちの好きな方法です。このアプローチの唯一のニュアンスは、の使用ですBroadcastReceivers。あなたがそれらに満足しているなら、あなたは金色です。

于 2012-08-15T20:50:41.313 に答える