2017-04-12 6 views
0

私はボタンでアプリを書くボタンがクリックされたときに、以下のメソッドが呼び出されます。アンドロイド入力システムは、入力イベントが処理されないことを知っているので、anr?

public void click(View view) { 
     while (true) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

ので、次の入力イベントが来た後明らかに、これはANRの原因となります。入力イベントを処理するこのクリックメソッドは、InputEventReceiverクラスのfinishInputEventメソッドを呼び出さないと思っていましたが、私は間違っていますが、clickメソッドが返されるかどうかは依然としてfinalInputEventが呼び出されます。 InputEventReceiverクラスのfinishInputEvent方法は、このようなものです:

public final void finishInputEvent(InputEvent event, boolean handled) { 
     if (event == null) { 
      throw new IllegalArgumentException("event must not be null"); 
     } 
     if (mReceiverPtr == 0) { 
      Log.w(TAG, "Attempted to finish an input event but the input event " 
        + "receiver has already been disposed."); 
     } else { 
      int index = mSeqMap.indexOfKey(event.getSequenceNumber()); 
      if (index < 0) { 
       Log.w(TAG, "Attempted to finish an input event that is not in progress."); 
      } else { 
       int seq = mSeqMap.valueAt(index); 
       mSeqMap.removeAt(index); 
       nativeFinishInputEvent(mReceiverPtr, seq, handled); 
      } 
     } 
     event.recycleIfNeededAfterDispatch(); 
    } 

私はANRが発生することがないようにnativeFinishInputEventが入力システムでキュー内の項目を削除しますと思ったが、今nativeFinishInputEventはまだと呼ばれることを、なぜまだANRますが発生することが?入力システムがどのように入力イベントを処理しないのか?

答えて

0

すべてのAndroid UIイベントは、特定のアプリケーションの1つのスレッドによって処理されます。そのスレッドをスリープ状態にすると、スレッドがそれ以上のイベントを処理できなくなり、キュー内に処理されていないイベント、つまりANRが検出されます。原則として、は決してのUIスレッドでスリープする必要があります。

+0

私は確かに、inputInputEventがまだ呼び出されている間に入力システムがどのように処理していないのかを知りたいだけです。 – cong

+0

あなたはそれが呼ばれていることをどのように知っていますか? – Clyde

+0

デモでアンドロイドのソースコードをデバッグしました。 – cong

関連する問題