6

私はAndroidでIOSアプリを書き直しています。それは私がアンドロイドを試して学ぶために設定したタスクです。Androidでは、さまざまな非同期メッセージングオプションについて学習しています。私がこれまでに見つけたものは次のとおりです。

Callbacks
Broadcasts
Message Handlers

私は自分の目的に最も適したアプローチを決定しようとしています。私のIOSアプリケーションには、10個の画面オブジェクトと1個のコーディネーターオブジェクトがあります。これは私のn-1です。

私のiOSが現在機能しているのは、画面オブジェクトがコーディネーターのworkメソッドを呼び出して、それ自体をデリゲートとして渡すことです。コーディネーターはいくつかの非同期作業を実行し、ジョブが完了するとデリゲートでさまざまなメソッドを呼び出します:完了/理由などで失敗しました。

複数の画面オブジェクトは、同時に実行する作業を要求できます。

これまでのところ、Androidでコールバック/メッセージハンドラーが近づくという私の感覚は、1-1の関係のようなものです。

私は地元の放送マネージャーを使うことに傾倒しています。これは、デリゲートメソッドというよりはNSNotificationに似ているように見えますが、n-1の関係のために作成されているようです。

ブロードキャストマネージャは、n-1の非同期作業を実現するための最良の方法ですか?

また、コールバックとハンドラーの1-1の関係についての私の仮定は正しいですか?

4

1 に答える 1

2

確かにNSNotificationのようなブロードキャストを使用できますが、私は通常、特定の部分ではなく、サービスとアクティビティの間の通信など、アプリのさまざまな部分の間でメッセージを送信するためにブロードキャストを使用します。

なぜあなたがAndroidのiOSであなたがしていることを正確に行うことができないのか分かりません。iOSには、呼び出す関数を定義するプロトコルがあり、Java / Androidでも、インターフェイスを使用して同じことを行うことができます。

iOSでは、次のようになります。

doStuffWithObject:(NSObject<SpecialStuff> *)object {}

Javaを使用している間は、次のようになります。

doStuffWithObject(SpecialStuff object) {}

SpecialStuffがプロトコルまたはインターフェースです。あなたはperformSelectorOnBackgroundアンドロイドにもう少し仕事がないので。タイマーを使用するか、ハンドラーと組み合わせて別のスレッドを使用するか、非同期タスクの最適な機能と大きさに応じてASyncTaskを使用します。

ASyncTaskは間違いなく調べる価値があります。


もちろん、 ObserverObservableを利用することもできます。

ハンドラーと、毎秒新しい時刻をリスナーに通知するタイマーを使用した簡単な例(この場合、ハンドラーはメインスレッドで作成されるためperformSelectorOnMainThread、iOSでの使用と同様にメッセージを送り返すことができます)。

    class SomeExample {

    private final ArrayList<TimeListener> timeListeners;

    private final Handler handler = new Handler();
    private final TimeUpdateRunnable timeUpdateRunnable = new TimeUpdateRunnable();

    public SomeExampleView {

        timeListeners = new ArrayList<TimeListener>();

        updateTimer = new Timer("General Update Timer");

        TimeUpdateTask timeUpdateTask = new TimeUpdateTask();
        updateTimer.scheduleAtFixedRate(timeUpdateTask, (60 * 1000) -   (System.currentTimeMillis() % (60 * 1000)), 60 * 1000);
    }

    public void addTimeListener(TimeListener timeListener) {
        timeListeners.add(timeListener);
    }

    public boolean removeTimeListener(TimeListener timeListener) {
        return timeListeners.remove(timeListener);
    }


    class TimeUpdateTask extends TimerTask {
        public void run() {
            handler.post(timeUpdateRunnable);
        }
    }

    private class TimeUpdateRunnable implements Runnable {
        public void run() {
            for (TimeListener timeListener : timeListeners) {
                timeListener.onTimeUpdate(System.currentTimeMillis());
            }
        }
    }
}

そして、私のリスナーインターフェースはObserver

public interface TimeListener {
    void onTimeUpdate(long time);
}
于 2012-11-23T15:25:09.973 に答える