繁体   English   中英

第一次恢复后Android onTouchListener Action_Up-MotionEvent延迟

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM