Android / Java में जावास्क्रिप्ट सेटइंटरवल / सेटटाइमआउट के बराबर क्या है?


129

क्या कोई मुझे बता सकता है कि क्या Android के लिए setInterval / setTimeout के लिए कोई समान मौजूद है? क्या किसी के पास कोई उदाहरण है कि यह कैसे करना है?

जवाबों:


245

एंड्रॉइड के साथ हमेशा ऐसा करने के बहुत सारे तरीके होते हैं, लेकिन यह मानते हुए कि आप कोड के एक टुकड़े को थोड़े समय बाद उसी धागे पर चलाना चाहते हैं, मैं इसका उपयोग करता हूं:

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);

.. यह बहुत ज्यादा के बराबर है

setTimeout( 
    function() {
        console.log("This will run 300 milliseconds later");
    },
300);

यह दराज के चयन और विखंडन के लिए एक बहुत अच्छा समाधान है
गोंकोलो

6
यदि मुझे आवश्यकता हो तो मैं इसे कैसे रद्द कर सकता हूं?
क्वेंटिन रॉय

रन () विधि के भीतर आप गतिविधि का दायरा कैसे प्राप्त करते हैं?
एंडी

@ इस तरह से:MyActivityName.this.myFunctionOnActivity()
बेन क्लेटन

1
@ क्वेंटिनॉय: Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);और यदि आप इसे रद्द करना चाहते हैं:timeout.removeCallbacks(r);
बैस्टियन स्प्रिंगर

101

setInterval ()

हर n मिलीसेकंड में खुद को दोहराने वाला फंक्शन

जावास्क्रिप्ट

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);

अनुमानित जावा समतुल्य

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "A Kiss every 5 seconds");
    }
},0,5000);

setTimeout ()

फ़ंक्शन जो n मिलीसेकंड के बाद ही काम करता है

जावास्क्रिप्ट

setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);

अनुमानित जावा समतुल्य

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);

5
इस scheduleAtFixedRateगतिविधि के समाप्त होने के बाद विधि के लिए, आप गतिविधि के भीतर टाइमर को कैसे रद्द करते हैं?
auroranil

2
@ user824294 आप अपने टाइमर उदाहरण को एक चर में सहेज सकते हैं और "रद्द ()" कॉल कर सकते हैं जब आप निर्धारित कार्यों को रोकना चाहते हैं - टाइमर t = new Timer (); t.scheduleAtFixedRate (...); - और फिर t.cancel () कॉल करें; जब भी तुम्हारी इच्छा हो
14

14

यदि आप अपने फोन को जगाने या मृतकों से अपने ऐप को वापस लाने के बारे में चिंतित नहीं हैं, तो प्रयास करें:

// Param is optional, to run task on UI thread.     
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // Do the task...
        handler.postDelayed(this, milliseconds) // Optional, to repeat the task.
    }
};
handler.postDelayed(runnable, milliseconds);

// Stop a repeating task like this.
handler.removeCallbacks(runnable);

मेरे फोन (हुआवेई पी स्मार्ट) पर हैंडलर स्लीप मोड से डिवाइस को नहीं जगाता है ( जैसा कि दूसरे जवाब में अपानलोको द्वारा टिप्पणी की गई है )
फ्रेंको

13

आप वास्तव में क्या हासिल करना चाहते हैं इसके आधार पर, आपको एंड्रॉइड हैंडलर पर एक नज़र रखना चाहिए:

http://developer.android.com/reference/android/os/Handler.html

यदि आपने पहले भविष्य में चलाने के लिए किसी कार्य को शेड्यूल करने के लिए जावास्क्रिप्ट सेटटाइमआउट () आदि का उपयोग किया था, तो यह करने का एंड्रॉइड तरीका है (पोस्टडेलएड / सेंडमैसेजडेलएड)।

ध्यान दें कि न तो हैंडलर या टाइमर नींद मोड से एक एंड्रॉइड फोन को जगाते हैं। दूसरे शब्दों में, यदि आप स्क्रीन को बंद / सीपीयू सोते हुए भी वास्तव में कुछ करने के लिए शेड्यूल करना चाहते हैं, तो आपको अलार्म मैनजर की भी जांच करने की आवश्यकता है।


5

मुझे जावास्क्रिप्ट के बारे में ज्यादा जानकारी नहीं है, लेकिन मुझे लगता है कि टाइमर वही हो सकता है जो आप खोज रहे हैं।

http://developer.android.com/reference/java/util/Timer.html

लिंक से:

एक-शॉट को एक निरपेक्ष समय पर या एक रिश्तेदार देरी के बाद चलाने के लिए निर्धारित किया जाता है। आवर्ती कार्यों को एक निश्चित अवधि या एक निश्चित दर के साथ निर्धारित किया जाता है।


नोट: यह आपको मुख्य / UI थ्रेड पर नहीं, बल्कि बैकग्राउंड थ्रेड पर कॉल करता है।
पैंग

यह एक उत्तर नहीं है, लेकिन बाहरी जानकारी का संदर्भ है जिसमें ओपी समाधान भी हो सकता है या नहीं भी हो सकता है। प्रासंगिक कोड ओपी उपयोग कर सकते हैं कृपया पेस्ट करें!
लेव

5

पहला उत्तर निश्चित रूप से सही उत्तर है और मैंने इस लैम्बडा संस्करण को बंद कर दिया है, जो वाक्य रचना में बहुत छोटा है। चूंकि रननेबल में केवल 1 ओवरराइड विधि है "रन ()", हम एक लैम्ब्डा का उपयोग कर सकते हैं:

this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);

5
import java.util.Timer;
import java.util.TimerTask;

class Clock {
    private Timer mTimer = new Timer();

    private int mSecondsPassed = 0;
    private TimerTask mTask = new TimerTask() {
        @Override
        public void run() {
            mSecondsPassed++;
            System.out.println("Seconds passed: " + mSecondsPassed);
        }
    };

    private void start() {
        mTimer.scheduleAtFixedRate(mTask, 1000, 1000);
    }

    public static void main(String[] args) {
        Clock c = new Clock();
        c.start();
    }
}

4

यहां एक सेटटाइमआउट समतुल्य है, जो अधिकतर देरी के बाद यूजर इंटरफेस को अपडेट करने की कोशिश में उपयोगी है।

जैसा कि आप जानते हैं, यूजर इंटरफेस को अपडेट केवल UI थ्रेड से किया जा सकता है। AsyncTask करता है कि आप उस धागे से इसकी onPostExecute विधि को कॉल करके।

new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // Update the User Interface
        }

    }.execute();

3
1. इसी तरह, onProgressUpdate()अनुकरण करने के लिए भी इस्तेमाल किया जा सकता है setInterval()2. AsyncTask एक थ्रेड पूल (या सिर्फ एक धागा) पर चलता है, इसलिए ए। यह एक और AsyncTaskखत्म होने तक इंतजार करना पड़ सकता है ; b । यह पूल से एक धागा लेगा।
पैंग

इस संदर्भ में async कार्य का उपयोग करते हुए बहुत सारे मुद्दे हैं (केवल एक थ्रेड और बिना किसी कारण के थ्रेड को लॉक करना) - अन्य समाधान बहुत बेहतर हैं।
मौलिक

4

मैं Android के लिए एक एमपी 3 प्लेयर बना रहा था, मैं हर 500ms में वर्तमान समय को अपडेट करना चाहता था इसलिए मैंने इसे इस तरह से किया

setInterval

private void update() {
    new android.os.Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            long cur = player.getCurrentPosition();
            long dur = player.getDuration();
            currentTime = millisecondsToTime(cur);
            currentTimeView.setText(currentTime);
            if (cur < dur) {
                updatePlayer();
            }

            // update seekbar
            seekBar.setProgress( (int) Math.round((float)cur / (float)dur * 100f));
        }
    }, 500);
}

जो एक ही विधि को पुनरावर्ती कहता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.