2

私は Android アプリを作成していますが、特定のことを定期的/継続的に実行できるようにする必要があります。私は C/C++ 組み込みファームウェアのバックグラウンドを持っていますが、この新しいやり方には慣れるまでに時間がかかります。Androidには「メインループ」のようなものはないようで、すべてがイベント駆動型です...デフォルトでは、記述したすべてのコードがGUIスレッドで動作することも理解しており、おそらく新しいスレッドを作成する必要があります「メインループ」に相当するものを実行するには...

これまでのところ、「doInBackground」メソッドに無限ループ (私のメイン ループ) が含まれている AsyncTask クラスの実装があります。このクラスのインスタンスを作成し、アプリの起動時にすぐに実行します。私が抱えている問題は、このスレッドとユーザー インターフェイスの間の相互作用にあります... メイン ループ スレッドで何かが発生し、GUI を更新したい場合、GUI スレッドで実行される「publishProgress」を呼び出す必要があることを理解してください。 . これにはいくつかの問題があります。主に、この「onProgressUpdate」メソッドで実行しようとした多くのことが機能しないか、予測可能な時間内に発生しないことです。

私の質問は、私がやろうとしていることを達成するためのより良い方法はありますか? 一般に、アプリケーションの実行中に定期的および/または継続的に実行したいコード、タイムリーにユーザー インターフェイスと対話する必要があるコードがある場合、ほとんどの人は何をしますか (タイムリーとは遅延ゼロを意味します)。

ありがとうございました。

public class MainLoopThread extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... arg0)
    {
        while(true)
        {
            //Do stuff

            //Update GUI
            publishProgress();
        }   
    }

    protected void onProgressUpdate(Void...voids)
    {
        //Update GUI
    }
}
4

2 に答える 2

1

あなたが何をしようとしているのかははっきりしていませんがAsyncTask、このように使用すると悪影響が生じる可能性があると言わせてください。

AsyncTask内部的には、からのものを実行するためにスレッドプールパターンを使用しますdoInBackground()。1.6より前のAndroidOSおよび3.0以降では、プールサイズはわずか1です。これは、一連のAsyncTasksの並列計算がないことを意味します。詳細については、こちらをご覧ください。

したがって、これにより、この電流のみAsyncTaskが実行され、他の電流が開始された場合でも、現在の電流が完了するまで待機する必要が生じる可能性があります。

定期的に行う必要があることに応じて、Androidは以下を公開します。

更新:コメントに基づくとService、UIのデータを使用してブロードキャストを定期的に送信するスレッドを開始するが必要なようです。次に、UI(アクティビティ)はブロードキャストレシーバーを登録して、それらのブロードキャストをキャッチし、データを抽出して、UIの更新に使用します。

于 2012-06-27T21:00:46.650 に答える
0

onProgessUpdate() が機能していないと言っていますか? それは奇妙に思えます。あなたが持っている別のオプションは、ループするスレッドを作成することです。秘訣は、UI スレッドを更新する場合は、view.post() を呼び出して、実際に更新を実行する runnable を与える必要があるということです。ここでの考え方は、UI スレッドで更新をスケジュールする必要があるということです。ただそれを受け取って今すぐ言うことはできません。

于 2012-06-27T20:31:56.943 に答える