[英]App stops unexpectedly when using OnTouchListener, MotionEvent.ACTION_UP
[英]Android onTouchListener Action_Up-MotionEvent delayed after first resume
我對Android和Java編程很陌生,並且能夠在這里找到很多解決方案。 但是我現在發現自己陷入困境,沒有找到任何在線解決方案
我編寫了一個簡單的應用程序,它在我的MainActivity的onCreate方法中創建了一個onTouchListener。 info()啟動一個新的InfoActivity。
如果我殺了我的應用程序並重新開始,我第一次觸摸信息ImageView時,我會快速連續看到ACTION_DOWN和ACTION_UP,新的InfoActivity會快速打開。
但是,如果我通過最小化它或訪問InfoActivity並返回(帶有finish())來恢復MainActivity,我現在注意到ACTION_DOWN和ACTION_UP事件之間的大約2000ms的延遲。 新活動也以相同的方式延遲,即使我在ACTION_DOWN案例中移動info()調用,就像在此處的代碼中一樣。
據我所知,在這兩秒延遲期間沒有任何事情發生。
請回答一種方法,我可以更好地解決這個問題。 我意識到可能有一個簡單的方法可以找到,但我花了幾個小時搜索,沒有嘗試過任何東西讓我更接近解決方案。
最好的祝福
朱利葉斯
info = (ImageView) findViewById(R.id.info);
info.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN: {
Log.i("MOTION_EVENT","ACTION DOWN");
info.setImageResource(R.drawable.infoback);
info();
Log.i("MOTION_EVENT","ACTION INFO");
break;
}
case MotionEvent.ACTION_CANCEL:{
Log.i("MOTION_EVENT","ACTION CANCEL");
info.setImageResource(R.drawable.info);
break;
}
case MotionEvent.ACTION_UP: {
Log.i("MOTION_EVENT","ACTION UP");
info.setImageResource(R.drawable.info);
break;
}
}
return true;
}
});
Log.i("TIMESTAMP","End onCreate");
這是啟動應用程序的日志,打開infoActivity,關閉infoActivity,然后再次嘗試這樣做,體驗減速。
06-29 02:12:12.529 15856-15856/de.juliusbier.shamebell I/TIMESTAMP﹕ Start onCreate
06-29 02:12:13.083 15856-15856/de.juliusbier.shamebell E/MediaPlayer﹕ Should have subtitle controller already set
06-29 02:12:13.083 15856-15856/de.juliusbier.shamebell I/TIMESTAMP﹕ End onCreate
06-29 02:12:13.084 15856-15856/de.juliusbier.shamebell I/TIMESTAMP﹕ Start onResume
06-29 02:12:13.084 15856-15856/de.juliusbier.shamebell I/SHAKER﹕ RESUME
06-29 02:12:13.084 15856-15856/de.juliusbier.shamebell I/TIMESTAMP﹕ End onResume
06-29 02:12:13.089 15856-15877/de.juliusbier.shamebell D/OpenGLRenderer﹕ Use EGL_SWAP_BEHAVIOR_PRESERVED: true
06-29 02:12:13.092 15856-15856/de.juliusbier.shamebell D/Atlas﹕ Validating map...
06-29 02:12:13.099 15856-15856/de.juliusbier.shamebell E/MediaPlayer﹕ Should have subtitle controller already set
06-29 02:12:13.128 15856-15877/de.juliusbier.shamebell I/Adreno﹕ EGLInit: QTI Build: 01/29/15, 1bccc5d, I0ba6dce82d
06-29 02:12:13.138 15856-15877/de.juliusbier.shamebell I/OpenGLRenderer﹕ Initialized EGL, version 1.4
06-29 02:12:13.144 15856-15877/de.juliusbier.shamebell D/OpenGLRenderer﹕ Enabling debug mode 0
06-29 02:12:20.480 15856-15856/de.juliusbier.shamebell I/MOTION_EVENT﹕ ACTION DOWN
06-29 02:12:20.521 15856-15856/de.juliusbier.shamebell I/MOTION_EVENT﹕ ACTION INFO
06-29 02:12:20.557 15856-15856/de.juliusbier.shamebell I/MOTION_EVENT﹕ ACTION UP
06-29 02:12:20.563 15856-15856/de.juliusbier.shamebell I/INFO﹕ Start onCreate
06-29 02:12:20.578 15856-15856/de.juliusbier.shamebell I/INFO﹕ Finish onCreate
06-29 02:12:24.992 15856-15856/de.juliusbier.shamebell I/TIMESTAMP﹕ Start onResume
06-29 02:12:24.993 15856-15856/de.juliusbier.shamebell I/SHAKER﹕ RESUME
06-29 02:12:24.993 15856-15856/de.juliusbier.shamebell I/TIMESTAMP﹕ End onResume
06-29 02:13:03.367 15856-15856/de.juliusbier.shamebell I/MOTION_EVENT﹕ ACTION DOWN
06-29 02:13:03.375 15856-15856/de.juliusbier.shamebell I/MOTION_EVENT﹕ ACTION INFO
-----------------------------Here comes the delay-------------------------------------
06-29 02:13:05.540 15856-15856/de.juliusbier.shamebell I/MOTION_EVENT﹕ ACTION UP
06-29 02:13:05.542 15856-15856/de.juliusbier.shamebell I/INFO﹕ Start onCreate
06-29 02:13:05.551 15856-15856/de.juliusbier.shamebell I/INFO﹕ Finish onCreate
更新:取出setImageResource調用解決了這個問題,在我看來,繪圖以某種方式延遲,並且在處理完所有setImageResources之后,新活動才會打開。
info = (ImageView) findViewById(R.id.info);
info.setImageResource(R.drawable.info_selector);
info.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
shaker.close();
Intent infoIntent = new Intent(getBaseContext(), InfoActivity.class);
startActivity(infoIntent);
}
});
使用Rajesh Batth的代碼,我遇到了同樣的問題。 請注意,onClick(View v)中的代碼是我以前的info()方法。 shaker.close在一個震動檢測類中調用以下行我改編自這篇文章的答案:
mgr.unregisterListener(listener);
不關閉搖床或甚至完全取出搖動檢測不會改變任何東西。
這與你的onTouch沒有任何關系,因為它正常工作。 問題是當onResume()被調用時,這意味着你的Activity恢復了super.onResume()被調用,並且該行實際上做了一些事情,當你觸摸屏幕ondispatchtouch被調用時調用你的觸摸代碼行並做了一些事情 - 這一切都在一個特定的線程,兩者都在連續運行 - 因此等待。 簡而言之 - 你的onResume()做了很多代碼,直到它完成對主線程上的android的調用一個相當凍結
編輯后的注釋 - & - 編輯
先生,我仍然堅持正在忙碌的線索,即使我接近的地方並不是滯后的原因。 如果你來自onResume()就好了這是因為android在繼續之前加載了你需要的資源,因為setImageResource()
實際上是在UI線程上運行的,而且還依賴於圖像的大小,這就是為什么我認為注釋或取出setImageResource()
后問題解決了
如果你在info()中進行任何耗時的操作,這可能會發生。 同時查看代碼,感覺就像使用onClickListener和selector drawable可以實現這一要求。 樣本選擇器就是這樣的。 info_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/infoback"/>
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/infoback"/>
<item android:state_focused="true" android:drawable="@drawable/infoback"/>
<item android:state_focused="false" android:state_pressed="false" android:drawable="@drawable/info"/>
</selector>
在Actitity
info = (ImageView) findViewById(R.id.info);
info.setImageResource(R.drawable.info_selector);
info.setOnClickListener(new OnClickListener(){
public void onClick(View v){
info();
}
});
我們有完全相同的行為,在我們的例子中,解決方案只是放置
setFocusable(true);
進入SurfaceView的構造函數(你可能在某處)。
在我們的例子中,SurfaceView看起來像這樣:
public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private GameActivity controller = null;
private InputComponent inputHandler = null;
public GameSurfaceView(GameActivity controller) {
super(controller);
this.controller = controller;
getHolder().addCallback( this );
setFocusable(true);
Log.d("GameSurfaceView", "constructor.");
}
}
這個帶有setFocusable的小行有一些奇怪的原因。 但是,我不知道,為什么延遲不會在應用程序的第一次啟動時發生。
Greez
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.