2

私は最初の Android アプリを作成しています (これまでのところ楽しいことがたくさんあります!)。障害に遭遇しました。Android 4.2 を対象とする SDK ツール 21.1 を使用しています。

設定された時間間隔でメソッドを呼び出すためにアクティビティを登録できるシステムをセットアップしようとしています。UIが応答しなくなるのを避けるために、リクエストの処理が独自のプロセスで処理されるような方法でこれを行いたかったのです。

私はいくつかの読書をしており、いくつかの道を探ってきました。最初は、サービスがこれを行う良い方法だと思っていましたが、OS が無差別にサービスを強制終了できるため、それは良い方法ではないことを示唆するかなりの情報を見つけました。

私は今、ScheduledThreadPoolExecutor の使用を検討しています。メソッドを渡すためのオーバーライド可能なメソッドを使用して、この単純なクラスを作成しました。

public abstract class BaseEvent implements EventListener {

    public abstract void onFire(Object... params);
} 

メソッドを呼び出すこの実行可能なタスクを作成しました。

public class HeartBeatTask implements Runnable {


    private BaseEvent mCallback;

    private Object mParams;

    public HeartBeatTask(BaseAioEvent callback,Object... params){
        mParams = params;

        mCallback = callback;
    }

    @Override
    public void run() {
        Log.d(LOG_TAG,"Run called");
        if(mCallback != null)
        {
            mCallback.onEvent(mParams);
        }

    }
}

このように使用します(アクティビティ内)

      ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(1);
      BaseEvent callback = new BaseEvent() {
            public void onFire(Object... params){
                if(params[0] !=null)
                {
                    Context context = (Context)params[0];
                    Toast toast = Toast.makeText(context, "Task ran", Toast.LENGTH_SHORT);
                    toast.show();
                }
            }

      };

      threadPool.scheduleAtFixedRate(new HeartBeatTask(callback,(this)),0, 5, TimeUnit.SECONDS);

これにより、5 秒ごとにタスクが実行されますが、コールバック メソッドは 1 回だけ実行されます。

これは物事を行うには良い方法ではないかもしれないと考えています。物事を複雑にしすぎているように感じます。私が本当に必要としているのは、メイン スレッド以外のプロセスでメソッドを実行し、設定された間隔でアクティビティが複数のアクションをバインドできる機能を持つことです。したがって、たとえば、データベースへの呼び出しが行われた後に UI コンポーネントを更新したい場合があり、それを 1 分ごとに実行したいとします。

ここで正しい軌道に乗っているかどうか教えてもらえますか? 私がやろうとしていることは、私の目標を達成するための実行可能な方法ですか? 私が取ることができるより良いアプローチはありますか?アドバイスや提案をいただければ幸いです。ありがとう!

4

3 に答える 3

3

Android 初心者向けのいくつかの提案。

  • と呼ばないでくださいseparate processプロセスは別のもの(Google の「Linux プロセス」) です。同じプロセス内の別のスレッドでそれらを呼び出す必要があります。

  • ScheduledThreadPoolExecutor ISは、Timers や PostDelayed など、ここで提案される他の何よりも優れています。

しかし、UI の更新は定期的に実行するのではなく、イベントベースで実行する必要があるという哲学的な誤りがあると思います。データベース、ディスク、またはネットワーク操作がバックグラウンド スレッドから終了したら、UI スレッドにコールバックしてすぐに更新します。

そのためのツールがいくつかあります。いくつかをリストします。私が一番気に入っているものを挙げますが、それぞれについて調査してみましょう。

  • Handler : それは基本的な Java の方法です
  • AsyncTask : 素晴らしいフレームワークですが、画面の回転を処理しません
  • ローダー:それが私の好みの方法です
于 2013-03-22T14:58:39.760 に答える
1

あなたのアプローチは少し複雑だと思います。あなたの例を考えてみましょう

So, for instance, I may want to have a UI component update after a call is made
to a database, and would want that to happen every minute.

私はこのようにするつもりだと思います。

  1. UIコンポーネントを更新するAsyncTaskを作成します。
  2. 新しいAsyncTaskを実行し、whileループで1分間スリープするスレッドを作成します。
  3. ある時点で、ステップ3のスレッドを開始します。
  4. コンポーネントを更新したくない場合は、スレッドを中断してください。

ステップ2の例

while (true) {
    try {
        new updateTask.execute();
        Thread.sleep(60000);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}
于 2013-03-22T15:06:20.973 に答える