3

Looper.MyQueue().AddIdleHandler()アプリがアイドル モードのときに、MonoDroid を使用していくつかのコマンドを実行しています。これは1つのアクティビティで機能していますが、2番目のアクティビティを開始すると、画面に触れるか最初のアクティビティを再開するまでハングします。2 番目のアクティビティでキューをブロックする可能性のあるループやものはありません。ルーパーがハングしないようにするにはどうすればよいですか?

Looper.MyQueue().AddIdleHandler(new ExecuteRunner(appState));
public class ExecuteRunner : Java.Lang.Object, MessageQueue.IIdleHandler
{
    int count = 0;
    ApplicationState appState;
    public ExecuteRunner(ApplicationState pAppState)
    {
        appState = pAppState;
    }

    public bool QueueIdle()
    {
        appState.YooManager.Manager.ExecuteCommand();
        count++;
        Android.Util.Log.Debug("YooBik-Exe", count.ToString());
        return true;
    }
}

メッセージ キューが何かによってブロックされていませんか? アイドル ハンドラーが動作していないアクティビティでは、OnTouch イベントが登録されます。

または、モノドロイドのアイドルハンドラーを実装する別の方法を知っている人はいますか?

4

2 に答える 2

1

画面にタッチするまでハングする場合は、 MessageQueue.next() ( line this.wait(); )で待機していると思います。メイン アクティビティ looper.loop() が MessageQueue.next() を呼び出し、それが何をするか: while(ture) { 1. pullNextLocked() 実行するメッセージがある場合は戻ります。それ以外の場合: 2. すべての queueIdle() を実行します。そして 3. this.wait(); <--------- ここが待ち合わせ場所です。}

touch を押すと、 MessageQueue.enqueueMessage(Message <-- touch msg ) が呼び出され、 this.notify() が実行されます。これにより、ポイント 3 が復活し、次にポイント 1 と 2 ( queueIdle() が実行されます) が実行されます。

それをハックするには、アクティビティから意味のないメッセージを自分自身に送信して、 MessageQueue.enqueueMessage を開始し、 MessageQueue.next() ループを起動します。

よろしく、 ズビシェク

于 2011-11-24T05:25:17.027 に答える
0

問題の原因かどうかはわかりませんが、Java.Lang.Objectから継承し、Handleの実装を削除するにはExecuteRunnerが必要です。システムがHandleメソッドを呼び出すと、未処理の例外がスローされ、スレッド/アプリが停止します。

于 2011-10-17T15:45:28.727 に答える