2011-05-25 45 views
1

UPDATE: 所以我想通了,這是因爲之後我把它傳遞給線程的MotionEvent變更後,該解決方案是這樣的:舉止怪異的觸摸事件

/** 
* Standard override to get touch screen motion events. 
*/ 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    MotionEvent passMe = MotionEvent.obtain(event); 
    event.recycle(); 
    return thread.doTouchEvent(passMe); 
} 

但不知何故,我結束了事件和具有相同MotionEvent ID的passMe,出於某種原因,不會創建新的MotionEvent。

我做錯了什麼? :(

--- VVV OLD VVV ---

我開發一個Android應用程序,我這裏有這個代碼,增加了動作類型ACTION_DOWN的任何觸摸輸入隊列:

/** Adds the touch event to the motionEventQueue for processing. */ 
public boolean doTouchEvent(MotionEvent event) { 
    //Only add the MotionEvent to the queue if we care about that kind of action. 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     motionEventQueue.add(event); 
    } 

    return true; 
} 

的問題是,這裏的代碼應該確保只有動作類型ACTION_DOWN的MotionEvents進入隊列,但不知何故,我結束了同類型ACTION_UP的MotionEvents和其他人的隊列裏。

這是怎麼回事看着調試器,它出現了在他們被添加到隊列時,他們的類型是ACTION_DOWN,但是當它處理隊列時,動作類型似乎已經發生了某種變化。

編輯:這裏是我的onTouchEvent方法:

/** 
* Standard override to get touch screen motion events. 
*/ 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return thread.doTouchEvent(event); 
} 

編輯:是否有與事實,我使用一個以上的線程呢?它是不同步還是什麼?

+0

你是否在事件中調用了recycle()? – 2011-05-25 21:55:40

+0

這是方法的名稱嗎?我可以找到SDK中沒有的「doTouchEvent」。除此之外,我的「onTouchEvent」方法的結構與您的示例類似,並且在SDK 2.2和2.3中似乎工作正常。另外,您是否確定「motionEventQueue」未添加到其他位置? – 2011-05-25 21:59:59

+0

doTouchEvent只是視圖中的onTouchEvent告訴線程執行的線程內部的方法。 另外我不打電話回收()的事件,是我應該? – 2011-05-25 22:35:25

回答

3

活動回收。您傳遞了對該事件的引用,並且正在爲您的隊列添加引用。該活動將被回收,因此您的參考指向使用舊活動回收的新活動。如果你幸運的話。

在執行onTouchEvent完成後,您不應該使用該事件。如果您需要持久存儲一些數據,請將其複製到您自己的結構中(或者克隆事件,如果可能的話)。

至於你的其他問題 - 只有UI線程處理觸摸事件,所以有多個線程應該沒有關係(除非你使用那些其他線程魚雷你的隊列)。

+1

就是這樣啊!謝謝(你的)信息。此外,您可以使用MotionEvent.obtain(event)克隆MotionEvent,它會根據事件返回新的MotionEvent。 – 2011-05-26 04:25:00

+0

實際上不知何故,新的MotionEvent以舊ID結尾...... – 2011-05-26 04:40:58

+0

我不會回收傳入的事件。將其留給框架。 – EboMike 2011-05-27 04:18:07