私はボタンでアプリを書くボタンがクリックされたときに、以下のメソッドが呼び出されます。アンドロイド入力システムは、入力イベントが処理されないことを知っているので、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ますが発生することが?入力システムがどのように入力イベントを処理しないのか?
私は確かに、inputInputEventがまだ呼び出されている間に入力システムがどのように処理していないのかを知りたいだけです。 – cong
あなたはそれが呼ばれていることをどのように知っていますか? – Clyde
デモでアンドロイドのソースコードをデバッグしました。 – cong