কোটলিনে বিলম্বের পরে কোনও ফাংশন কীভাবে ডাকবেন?


153

শিরোনাম হিসাবে, বিলম্বের পরে কোনও ফাংশন কল করার কোনও উপায় আছে (উদাহরণস্বরূপ 1 সেকেন্ড) Kotlin?

উত্তর:


134

আপনি শিডিউল ব্যবহার করতে পারেন

inline fun Timer.schedule(
    delay: Long, 
    crossinline action: TimerTask.() -> Unit
): TimerTask (source)

উদাহরণ (ধন্যবাদ @ এনগুইন মিন বিন - এটি এখানে খুঁজে পেয়েছেন: http://jamie.mccrindle.org/2013/02/exploring-kotlin-standard-library-part-3.html )

import java.util.Timer
import kotlin.concurrent.schedule

Timer("SettingUp", false).schedule(500) { 
   doSomething()
}

16
ধন্যবাদ! খুব সহজ। এখানে উদাহরণ খুঁজে পেয়েছেন জ্যামি.এমসিসিআরইন্ডল.আর Timer("SettingUp", false).schedule(500) { doSomething() }
মিন বিন বিন

9
আপনি যদি এই দুটি আমদানি যোগ করেন তবে এটি সংকলন করে: java.util.Timer আমদানি করুন এবং আমদানি করুন কোটলিন.কমারেন্ট.সেকুলেড
কাস্টমাইজার

3
@ মাতিয়াস এলরিরিগা, আমার জন্য, এটি একটি নতুন ব্র্যান্ডের ফাইলে রাখলে সংকলন হয় না, এমনকি আমদানি যুক্ত করে কাস্টমাইজার বলেছিলেন
সালফকাইন

3
আপনি একটি ফাইল এটা করা, যে পদ্ধতি stdlib অংশ, উত্তর প্রথম লাইন লিংকে অনুসরণ প্রয়োজন হবে না
Matias Elorriaga

3
আমি প্রাথমিকভাবে ভেবেছিলাম এটি আমদানি করার পরেও সংকলন করবে না kotlin.concurrent.schedule, কারণ কোটলিন কেবল একটি স্বাক্ষরের অমিলের অভিযোগ করেছিল, তবে আমি বুঝতে পেরেছিলাম যে আমি লংয়ের পরিবর্তে একটি ইন্টার পাস করার চেষ্টা করছি। এটি সংশোধন করার পরে সংকলিত।
জো ল্যাপ

178

ব্যবহার করার জন্য একটি বিকল্পও রয়েছে Handler -> postDelayed

 Handler().postDelayed({
                    //doSomethingHere()
                }, 1000)

18
দয়া করে যুক্ত করুন যে এটি কেবল অ্যান্ড্রয়েডে উপলব্ধ, যেহেতু প্রশ্নটি একটি সাধারণ কোটলিন পদ্ধতি জিজ্ঞাসা করে (যদিও এটিতে অ্যান্ড্রয়েড ট্যাগ রয়েছে)
ইওভা স্টার্নবার্গ

5
এটি আপনার পক্ষ থেকে গঠনমূলক নয়। ফলস্বরূপ যখন ব্যবহারকারীরা অ্যান্ড্রয়েড ট্যাগ অনুসন্ধান করবে তখন ভাবতে পারে এটি ভুল উত্তর।
বোগদান উস্তিক

9
: Android এর জন্য, এটা ভাল টাইমার চেয়ে হ্যান্ডলার ব্যবহার করবেন তা stackoverflow.com/questions/20330355/timertask-or-handler
woprandi

আমি মনে করি, ক্রিয়াকলাপ / খণ্ড খণ্ডের পরে হ্যান্ডলারের অপসারণের জন্য আপনার একটি কোড যুক্ত করা উচিত।
শীতলমাইন্ড

আপনি যদি এটি করার ইচ্ছা করেন তবে এটি ইউআই থ্রেডে চলবে না।
অ্যান্ড্রয়েড ডেভ

93

অনেক পথে

1. Handlerক্লাস ব্যবহার

Handler().postDelayed({
    TODO("Do something")
    }, 2000)

2. Timerক্লাস ব্যবহার

Timer().schedule(object : TimerTask() {
    override fun run() {
        TODO("Do something")
    }
}, 2000)

অপেক্ষাকৃত ছোট

Timer().schedule(timerTask {
    TODO("Do something")
}, 2000)

সংক্ষিপ্ততম

Timer().schedule(2000) {
    TODO("Do something")
}

3. Executorsক্লাস ব্যবহার

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)

1
এবং আপনি এখানে সেরা সমাধান কি মনে করেন?
তামিম আতাফি

1
সম্ভবত প্রথমটি হ্যান্ডলার ব্যবহার করছে। দেখুন stackoverflow.com/a/40339630/1159930
Markymark

36

আপনাকে নিম্নলিখিত দুটি গ্রন্থাগার আমদানি করতে হবে:

import java.util.*
import kotlin.concurrent.schedule

এবং তারপরে এটি এইভাবে ব্যবহার করুন:

Timer().schedule(10000){
    //do something
}

27

আপনি launchএকটি কর্টিন করতে পারেন , delayএটি এবং তারপরে ফাংশনটি কল করতে পারেন:

 /*GlobalScope.*/launch {
   delay(1000)
   yourFn()
 }

আপনি যদি কোনও শ্রেণীর বাইরে থাকেন বা অবজেক্টটি GlobalScopeসেখানে কর্টিন চালানোর জন্য প্রস্তুত হন, অন্যথায় CoroutineScopeআশেপাশের শ্রেণিতে এটি প্রয়োগ করার পরামর্শ দেওয়া হয় , যা প্রয়োজনে সেই সুযোগের সাথে সম্পর্কিত সমস্ত কর্টিনগুলি বাতিল করতে দেয়।



@ কুলমাইন্ড তারা কয়েক মাস থেকে স্থিতিশীল, তাই তারা একেবারে নতুন ...
জোনাস উইলস

হ্যাঁ, অক্টোবর-নভেম্বর থেকে, তবে আগে ছিল।
শীতলমাইন্ড

21
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)

1
আপনি কি আমাকে দয়া করে ব্যাখ্যা করতে পারেন কেন আমাকে শুধু ধনুর্বন্ধনী বদলে "টাইমার টাস্ক" লেখার দরকার আছে?
হুগো

2
আমি মনে করি তুমি করো. এটি প্রথম যুক্তি হিসাবে Timer.schedule()প্রত্যাশা করে একটি দৃষ্টিতে প্রদত্ত ল্যাম্বদা মোড়ানো । এখানে দেখুন: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…TimerTaskkotlin.concurrent.timerTask()TimerTask
ব্লিইক

এছাড়াও, প্রদত্ত উদাহরণটি এক লাইনে ঘনীভূত হতে পারে যদি Timerবস্তুটি একাধিকবার ব্যবহার না করা হয়, যেমন Timer().schedule(timerTask { ... }, 3000),। আরও একটি কোটলিন বান্ধব বিকল্প উপলব্ধ; জঙ্গুয়ারের উত্তর দেখুন।
ব্লিইক

10

একটি টাসট 3 সেকেন্ড পরে দেখানোর একটি সাধারণ উদাহরণ :

fun onBtnClick() {
    val handler = Handler()
    handler.postDelayed({ showToast() }, 3000)
}

fun showToast(){
    Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}

1
আমি কি কল বাতিল করতে পারি?
এডুয়ার্ডো অলিভারস

6

আপনি যদি জেনেরিক ব্যবহারের সন্ধান করেন তবে আমার পরামর্শটি এখানে:

নামে একটি শ্রেণি তৈরি করুন Run:

class Run {
    companion object {
        fun after(delay: Long, process: () -> Unit) {
            Handler().postDelayed({
                process()
            }, delay)
        }
    }
}

এবং এটির মতো ব্যবহার করুন:

Run.after(1000, {
    // print something useful etc.
})

আপনি এটিকে এক্সটেনশন ফুকশন হিসাবে সহজ করতে পারেন
ভ্লাদ

@ ওগলকান, আরও কোটলিনিক লামদা Run.after(1000) { toRun() }। আমি কি সঠিক
বিনরেবিন

0

আমি সিঙ্গলথ্রেড ব্যবহার করার পরামর্শ দিয়েছি কারণ এটি ব্যবহারের পরে আপনাকে এটি মারতে হবে না। এছাড়াও, " স্টপ ()" পদ্ধতিটি কোটলিন ভাষায় হ্রাস করা হয়েছে।

private fun mDoThisJob(){

    Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
        //TODO: You can write your periodical job here..!

    }, 1, 1, TimeUnit.SECONDS)
}

তদুপরি, আপনি সাময়িক কাজের জন্য এটি ব্যবহার করতে পারেন। এটা খুবই কাজের. আপনি যদি প্রতি সেকেন্ডের জন্য কাজ করতে চান তবে আপনি সেট করতে পারেন কারণ এর পরামিতি:

এক্সিকিউটার্স.নিউসিংলথ্রেডসচেডুডএক্সেকিউটার ()। শিডিউলএটিফিক্সডরেট (চলমান কমান্ড, দীর্ঘ ইনিশিয়ালডিলি, দীর্ঘকালীন, টাইমউনিত ইউনিট);

টাইমউনাইট মানগুলি: ন্যানোসেকেন্ডস, মাইক্রোসেকেন্ডস, মিলিসেকেন্ডস, সেকেন্ডস, মিনিটস, আওয়ারস, ডে

@canerkaseler

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.