![](/img/trans.png)
[英]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.