Új hozzászólás Aktív témák

  • thon73
    tag

    "Akkor a custom View osztályban lesz egy mHandler = new Handler(); rész. Ha jól értem, ez rácsatlakozik az UI thread által létrehozott looper-re."

    Igen és igen.

    Hogyan tudom ezt az egészet megállítani? Kiadok egy mHandler.removeCallbacks() utasítást?

    Igen. Ha megnézed a metódus szignatúráját, láthatod, hogy meg kell adni azt a Runnable példányt, aminek az ütemezését vissza akarod vonni.

    "1. De mi lesz ebben a runnable? Vagy egy runnable-vel meg tudom csinálni a fenti sort?"

    Ha kicsit konkretizáltad volna, hogy mit csinál a View-d és miért kell hozzá két ütem, nem kellene ennyire a levegőbe beszélnünk. Mindenesetre az biztos, hogy a késleltetett kódrészlete(ke)t ki kell raknod tagváltozó(k)ba, mert így tudsz a konkrét Runnable példányokra hivatkozni - melyek egyébként tipikusan lambdák vagy anoním osztályok.

    Például (kicsit pszeudokód lesz, mert most nincs előttem IDE):

    private Handler mHandler = new Handler();

    private Runnable mDelayedStep = new Runnable() {
    public void run() {
    Log.w(TAG, "BOOM!");
    }
    };

    public boolean onTouch(View v, MotionEvent event) {
    mHandler.removeCallbacks(mDelayedStep);
    mHandler.postDelayed(mDelayedStep, 5000);
    return true;
    }

    És ezzel írtál is egy mini játékot, amiben akkor robban a bomba, ha a felhasználó öt másodpercig nem nyúl a telefonhoz :P Amíg simogatja, elodázza a végzetét.

    Retrolambdával egyébként egy kicsit tömörebb:
    private Runnable mDelayedStep = () -> Log.w(TAG, "BOOM!");

    2. Azonnal megáll a végrehajtás, vagy a következő "tick" még lefut?

    Azonnal hat, tehát nem fog lefutni, amit kivettél.

    3. Ha leállítom, akkor rögtön indíthatok egy ugyanilyen ütemet, ugyanezekkel a példányokkal?

    Persze. Sőt, ha az lenne az igény, egy Runnable-t többször is beütemezhetsz, mert a message queue-ba többször is bekerülhet ugyanaz a példány. Fontos megjegyezni, hogy a removeCallbacks az összes hozzá tartozó üzenetet kiveszi.

    Nagy-nagy köszönöm! :R :R :R
    már olvasgattam egy ideje, de még egyik cikk sem foglalta össze ilyen jól! (Vagy valószínűleg túl részletes volt.)

    Konkrétan egyébként továbbra is a billentyűzet téma, ami az egyik gépemen tökéletesen működik, a másikon tökéletesen nem - mert nem ad onTouchEvent jelet, ha nincs mozgás.
    Az "leütés" után hosszabb a várakozási idő, mint az ismétlések között = ez egyszer két időintervallum. Bizonyos billentyűk nem ismétlik önmagukat, hanem két jelentésük van. Az egyik mód a másodlagos jelentés előhozására, ha hosszan tartom. Ilyenkor a két jelentés váltakozik, de mindig a "hosszú" idő után. A logikus számomra az volt, hogy meghívom a "jelentést", vagyis amit a billentyű csinál, és az adja vissza, hogy a továbbiakban hosszú vagy rövid várakozás kell a következő tick-hez.
    De a fentiek alapján már prímán meg fogom tudni csinálni, köszönöm!

    Érdekes egyébként, hogy a billentyűzettel kapcsolatos dolgokról alig van valami szó ((jó, ez a kérdés nem pont billentyűzettel kapcsolatos)); és rengeteg illogikus vagy rosszul dokumentált rész van benne. Pedig nagyon izgalmas része lenne egy érintőképernyőnek.

Új hozzászólás Aktív témák