簡體   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