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

时间:2015-06-29 00:02:33

标签: java android performance

我对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

UPDATE:取出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在我根据this post的答案改编的摇动检测类中调用以下行:

        mgr.unregisterListener(listener);

不关闭摇床或甚至完全取出摇动检测不会改变任何东西。

3 个答案:

答案 0 :(得分:1)

这与你的onTouch无关,因为它正常工作。问题是当onResume()被调用时,这意味着你的Activity恢复了super.onResume()被调用,并且该行实际上做了一些事情,当你触摸屏幕ondispatchtouch被调用时调用你的触摸代码行并做了一些事情 - 这一切都在一个特定的线程,两者都在连续运行 - 因此等待。简而言之 - 你的onResume()做了很多代码,直到它完成对主线程上的android的调用一个相当冻结的

编辑 - 后您的-comment-&安培; -edit

先生,我仍然坚持正在忙碌的线索,即使我接近的地方不是滞后的原因。如果你来自onResume()就好了,这是因为android在继续之前加载你所需的资源,因为setImageResource()实际上是在UI线程上运行的,而且还取决于图像的大小这就是为什么我认为您的问题在评论或取出setImageResource()

后得以解决

答案 1 :(得分:1)

如果您在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();
    }
});

答案 2 :(得分:0)

我们有完全相同的行为,在我们的例子中,解决方案只是放

String pathOne = "path";
File file1 = new File(pathOne);

String pathTwo = "path";

进入SurfaceView的构造函数(你可能在某处)。

在我们的例子中,SurfaceView看起来像这样:

setFocusable(true);

这个带有setFocusable的小行有一些奇怪的原因。 但是,我不知道为什么在应用程序的第一次启动时不会发生延迟。

Greez