অ্যান্ড্রয়েডে বিলম্বের পরে কোনও পদ্ধতিতে কল করতে কীভাবে


768

আমি একটি নির্দিষ্ট বিলম্বের পরে নিম্নলিখিত পদ্ধতিটি কল করতে সক্ষম হতে চাই। উদ্দেশ্য সিতে এখানে কিছু ছিল:

[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];

জাভা সহ অ্যান্ড্রয়েডে কি এই পদ্ধতির সমান? উদাহরণস্বরূপ আমার 5 সেকেন্ড পরে কোনও পদ্ধতিতে কল করতে সক্ষম হওয়া দরকার।

public void DoSomething()
{
     //do something here
}

উত্তর:


1858

Kotlin

Handler().postDelayed({
  //Do something after 100ms
}, 100)


জাভা

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);



108
এই সমাধানটি কেবলমাত্র ইউআই থ্রেডে দরকারী। অন্যথায় সাধারণ থ্রেডে আপনাকে লুপ প্রয়োগ করতে হবে যা আমার মনে করা সেরা সংস্করণ নয়
অলিভিয়ের_এসডিজি

2
@olivier_sdg আপনি কেন লুপার প্রয়োগের প্রয়োজন?
djechlin

37
@ ডিজেচলিন একটি হ্যান্ডলার অবশ্যই সর্বদা একটি লুপারের সাথে লিঙ্কযুক্ত থাকতে হবে, এটি আসলে আপনার পোস্ট করা রান্নেবল প্রক্রিয়া করবে ()। ইউআই থ্রেডটি ইতিমধ্যে একটি লুপারের সাথে আসে, আপনি কেবলমাত্র ইউআই থ্রেডে একটি নতুন হ্যান্ডলার () তৈরি করতে পারেন এবং এটিতে সরাসরি রান্নেবলগুলি পোস্ট করতে পারেন। এই রান্নেবলগুলি ইউআই থ্রেডে চালিত হয়। রান্নেবলকে অন্য থ্রেডে এক্সিকিউট করার জন্য আপনাকে একটি নতুন থ্রেড তৈরি করতে হবে, তারপরে লুপার.প্রেপার (), একটি নতুন হ্যান্ডলার () এবং তারপরে লুপার.লুপ () তৈরি করতে হবে। এই নতুন হ্যান্ডলারে পোস্ট করা যে কোনও রানবেলগুলি এই নতুন থ্রেডটিতে কার্যকর করবে। আপনি যদি এই সমস্ত কিছু না করেন তবে পোস্ট () একটি ব্যতিক্রম ছুঁড়ে দেবে।
দোরোরো

12
যদি আপনি, আপনি করতে প্রয়োজন বাতিল যতদিন মৃত্যুদন্ড যেমন runnable কল করে বার্তা সারিতে এখনও removeCallbacks(Runnable r)উপর Handler
ডেনিস

9
উচিতimport android.os.handler
কাকা

321

আমি আমার ক্ষেত্রে অন্য কোনও উত্তর ব্যবহার করতে পারিনি। আমি এর পরিবর্তে নেটিভ জাভা টাইমার ব্যবহার করেছি।

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // this code will be executed after 2 seconds       
    }
}, 2000);

43
হ্যান্ডলারের ব্যবহারকারীর চেয়ে এটি ভাল, কারণ হ্যান্ডলার যখন ইউআই থ্রেডে চালিত হয় না তখন এতে লুপের সমস্যা থাকে না।
বেন এইচ

32
অ্যান্ড্রয়েড ডক্টের মতে এটি আর প্রয়োজন না হলে এটি বাতিল করার জন্য আপনার টাইমারটির একটি রেফারেন্স রাখা উচিত: "যখন টাইমারটির আর প্রয়োজন হয় না তখন ব্যবহারকারীদের বাতিল () কল করা উচিত, যা টাইমার থ্রেড এবং অন্যান্য সংস্থানগুলি প্রকাশ করে। স্পষ্টভাবে বাতিল না হওয়া টাইমারগুলি অনির্দিষ্টকালের জন্য সংস্থান রাখতে পারে। "
Pooks

14
মনোযোগ! এটি ইউআই থ্রেডে চলবে না। এটি ইউআই থ্রেডে চালানো মারাত্মক ত্রুটির কারণ ঘটেছে: android.view.ViewRootImpl led কলযুক্তফ্রমআরংথ্রেডঅ্যাক্সেপশন: কেবলমাত্র মূল থ্রেড যা একটি ভিউ হায়ারারচি তৈরি করেছে কেবল তার দর্শনগুলিকে স্পর্শ করতে পারে।
ওয়াওয়োস্ট ইস্ট

13
@ ওভোস্ট কেবল এটি কারণ আপনি টাইমার ব্লকের ভিতরে ইউআই উপাদানগুলি আপডেট করছেন
টিম

10
নোট করুন যে java.util.Timer (এবং টাইমারটাস্ক) জেডিকে 9 এ ছিন্ন করা হবে Time টাইমারটাস্ক কাজের জন্য নতুন থ্রেড তৈরি করে যা খুব ভাল নয়।
ভারভারা কালিনিনা

183

দ্রষ্টব্য: যখন প্রশ্নটি Android এর প্রসঙ্গ হিসাবে নির্দিষ্ট করে না তখন এই উত্তর দেওয়া হয়েছিল। অ্যান্ড্রয়েড ইউআই থ্রেড সম্পর্কিত নির্দিষ্ট উত্তরের জন্য এখানে দেখুন।


দেখে মনে হচ্ছে ম্যাক ওএস এপিআই বর্তমান থ্রেড চালিয়ে যেতে দেয় এবং অ্যাসিঙ্ক্রোনালি চালানোর জন্য কার্যের সময়সূচি দেয়। জাভাতে, java.util.concurrentপ্যাকেজটি সমপরিমাণ ফাংশন সরবরাহ করে । আমি নিশ্চিত নই যে অ্যান্ড্রয়েড কোন সীমাবদ্ধতা আরোপ করতে পারে।

private static final ScheduledExecutorService worker = 
  Executors.newSingleThreadScheduledExecutor();

void someMethod() {
  
  Runnable task = new Runnable() {
    public void run() {
      /* Do something… */
    }
  };
  worker.schedule(task, 5, TimeUnit.SECONDS);
  
}

3
এটি আমার জন্য কখনই রান্নেবলকে কল করে না
সুপুস্তার

14
পার্শ্ব নোট হিসাবে: এটি আপনাকে পরে এই কার্যটি বাতিল করতে দেয় যা কিছু পরিস্থিতিতে সহায়ক হতে পারে। কেবলমাত্র ScheduledFuture<?>ফিরে আসা একটি রেফারেন্স সঞ্চয় করুন worker.schedule()এবং এর cancel(boolean)পদ্ধতিটি কল করুন ।
ডেনিস

আমি মনে করি এই উত্তরটি পুরানো। .শাদুলে এখন আর রান্নেবলের কোনও পদ্ধতি বলে মনে হচ্ছে না ...? : /
বীট্রি

5
@ তবে এটি একটি পদ্ধতি চালু ScheduledExecutorService
এরিকসন

3
ইউআই থ্রেড অবজেক্টস জড়িত থাকলে এটি কাজ করে না আপনি রানঅনুইথ্রেড (নতুন রান্নেবল () {রান () ....}) কল করতে হবে; অথবা রান () inside inside এর ভিতরে থেকে হ্যান্ডলার অবজেক্টটি ব্যবহার করে একটি রান্নেবল পোস্ট করুন
জয়ন্ত অরোরা

107

5 সেকেন্ড পরে ইউআই থ্রেডে কিছু কার্যকর করার জন্য:

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something here
    }
}, 5000);

8
নিশ্চিত করুন, লুপ.প্রিপারে কলটি রোধ করার এবং পুরো জিনিসটি ইউআই থ্রেডে রাখার জন্য এটি সেরা সমাধান।
টব্লিউগ

এর জন্য ধন্যবাদ, লুপার বিষয়গুলিতে আমাকে সহায়তা করেছে :)
টিয়া

1
আমি প্রধান লুপে একটি হ্যান্ডলার তৈরি করার বিষয়ে সতর্কতা অবলম্বন করব, তারপরে এই থ্রেডটিতে দীর্ঘকালীন কোনও কাজ করা উচিত নয়
শায়ান_আরয়ান ১

40

আপনি ইউআইটিথ্রিডের ভিতরে হ্যান্ডলারটি ব্যবহার করতে পারেন:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
         final Handler handler = new Handler();
         handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               //add your code here
           }
         }, 1000);

    }
});

36

সমস্ত দুর্দান্ত উত্তরের জন্য ধন্যবাদ, আমি একটি সমাধান পেয়েছি যা আমার প্রয়োজনের সাথে সর্বাধিক উপযুক্ত।

Handler myHandler = new DoSomething();
Message m = new Message();
m.obj = c;//passing a parameter here
myHandler.sendMessageDelayed(m, 1000);

class DoSomething extends Handler {
    @Override
    public void handleMessage(Message msg) {
      MyObject o = (MyObject) msg.obj;
      //do something here
    }
}

আমি যদি কোনও আইটেমের ক্লিকের স্পর্শ প্রতিক্রিয়া জানাতে এই পদ্ধতির ব্যবহার করি .. ভিউ.সেট কালার (কিছু_ রঙ) এবং তারপরে এক্স সেকেন্ডের পরে হ্যান্ডলারের এই রঙটি সরিয়ে ফেলা ...?
eRaisedToX

24

Kotlinএবং Javaঅনেক উপায়

1. ব্যবহার Handler

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

২. টাইমারটাস্ক ব্যবহার করা

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. ব্যবহার Handler

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something
    }
}, 2000);

2. ব্যবহার Timer

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // Do something
    }
}, 2000);

3. ব্যবহার ScheduledExecutorService

private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();

Runnable runnable = new Runnable() {
  public void run() {
      // Do something
  }
  };
worker.schedule(runnable, 2, TimeUnit.SECONDS);

1
@ জনরবে আপনার পরামর্শের জন্য ধন্যবাদ। আমি এটি প্রশংসা করি। তবে প্রশ্ন হল How to call a method after a delay in Android। সুতরাং আমি যে ফোকাস। যথাযথ. অন্যথায় জাভা ফাঁস বিকাশকারীদের জন্য আলাদাভাবে বোঝার জন্য একটি বড় বিষয়।
খেমরাজ

20

এই ডেমো দেখুন:

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

class Test {
     public static void main( String [] args ) {
          int delay = 5000;// in ms 

          Timer timer = new Timer();

          timer.schedule( new TimerTask(){
             public void run() { 
                 System.out.println("Wait, what..:");
              }
           }, delay);

           System.out.println("Would it run?");
     }
}

20

যদি আপনাকে হ্যান্ডলারটি ব্যবহার করতে হয় তবে আপনি অন্য থ্রেডে রয়েছেন, আপনি runonuithreadইউআই থ্রেডে হ্যান্ডলারটি চালনার জন্য ব্যবহার করতে পারেন । এটি আপনাকে কল করতে জিজ্ঞাসা করা ব্যতিক্রমগুলি থেকে রক্ষা করবেLooper.Prepare()

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //Do something after 1 second
            }
        }, 1000);
    }
});

দেখতে বেশ অগোছালো মনে হচ্ছে তবে এটি অন্যতম উপায়।


4
এটি কাজ করে, আমি আপনার পোস্টটি সম্পাদনা করতে পারছি না কারণ এডিট করার জন্য ন্যূনতম 6 টি অক্ষরের সাথে বোকা এসও নিয়ম রয়েছে, তবে 'নতুন হ্যান্ডলার'-এর পরে' () 'নিখোঁজ রয়েছে এটি' নতুন হ্যান্ডলার () 'হওয়া উচিত
জোনাথন মুলার

2
UI থ্রেডে সবকিছু রাখার পরিবর্তে আপনি এটি করতে পারেন: নতুন হ্যান্ডলার (Looper.getMainLooper ())
টব্লিউগ

17

আমি View.postDelayed()পদ্ধতি, নীচে সহজ কোড ব্যবহার করতে পছন্দ করি :

mView.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 1000 ms
    }
}, 1000);

1
এটি কী ইউআই উপাদানটি নিজেই হিমশীতল করে না, কারণ এটি ভিউ হ্যান্ডলারের উপর নির্ধারিত হবে?
জ্যাকসঅনএফ

1
না, পোস্ট টাস্কটি 1 সেকেন্ডে কার্যকর করা হবে, তবে এই দ্বিতীয় ইউআই থ্রেডের সময় অন্যান্য দরকারী কাজগুলি হয়
ডেমাক্সি

14

এখানে আমার সংক্ষিপ্ততম সমাধান:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something after 100ms
    }
}, 100);

10
final Handler handler = new Handler(); 
Timer t = new Timer(); 
t.schedule(new TimerTask() { 
    public void run() { 
        handler.post(new Runnable() { 
            public void run() { 
                //DO SOME ACTIONS HERE , THIS ACTIONS WILL WILL EXECUTE AFTER 5 SECONDS...
            }
        }); 
    } 
}, 5000); 

9

যদি আপনি অ্যান্ড্রয়েড স্টুডিও 3.0.০ এবং তার বেশি ব্যবহার করে থাকেন তবে আপনি ল্যাম্বদা এক্সপ্রেশন ব্যবহার করতে পারেন। পদ্ধতিটি callMyMethod()2 সেকেন্ড পরে বলা হয়:

new Handler().postDelayed(() -> callMyMethod(), 2000);

যদি আপনার এই বিলম্বিত চলমানযোগ্য ব্যবহারটি বাতিল করতে হয়:

Handler handler = new Handler();
handler.postDelayed(() -> callMyMethod(), 2000);

// When you need to cancel all your posted runnables just use:
handler.removeCallbacksAndMessages(null);

কীভাবে আমরা এটি বাতিল করতে পারি?
দামিয়া ফুয়েন্তেস

আমি অবাক হয়েছি এখানে কতজন খুশিতে কোটলিনের দিকে চলে যাবে, তবুও ল্যাম্বডা এক্সপ্রেশনগুলি পুরোপুরি উপেক্ষা করবে যা মানক জাভা।
টমডকে

6

আমি আপনাকে পরামর্শ দিচ্ছি টাইমার , আপনার নির্দিষ্ট সময় নির্ধারণের জন্য একটি পদ্ধতি একটি খুব নির্দিষ্ট ব্যবধান আহ্বান করা সম্ভব হবে। এটি আপনার ইউআইকে অবরুদ্ধ করবে না এবং পদ্ধতিটি কার্যকর হওয়ার সময় আপনার অ্যাপ্লিকেশনটিকে পুনঃসংবেদনশীল রাখবে।

অন্য বিকল্পটি হ'ল অপেক্ষা (); পদ্ধতি, এটি নির্দিষ্ট সময়ের জন্য বর্তমান থ্রেডটিকে ব্লক করবে। আপনি যদি ইউআই থ্রেডটিতে এটি করেন তবে এটি আপনার ইউআইয়ের প্রতিক্রিয়া বন্ধ করবে।


2
থ্রেড.স্লিপ () অবজেক্ট.ওয়েট () এর চেয়ে ভাল। অপেক্ষা আপনাকে বোঝায় যে আপনি অবহিত হওয়ার প্রত্যাশা করছেন এবং কিছু ক্রিয়াকলাপের চারপাশে সিঙ্ক্রোনাইজ করছেন। ঘুম নির্দেশ করে যে আপনি কিছু নির্দিষ্ট সময়ের জন্য কিছু করতে চান না। টাইমার হ'ল উপায় হ'ল যদি আপনি সময়টির পরে কোনও সময়ে অ্যাসিক্রোনালিকভাবে ক্রিয়াটি ঘটতে চান।
টিম বেন্ডার

1
ঐটা সত্য. আমি কেন এটিকে অন্য বিকল্প হিসাবে তালিকাভুক্ত করেছি ;-)
নেট

6

একটি সাধারণ লাইন হ্যান্ডেল পোস্ট বিলম্বের জন্য, আপনি নিম্নলিখিত হিসাবে করতে পারেন:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do someting
    }
}, 3000);

আশা করি এটা কাজে লাগবে


5

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

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //Write your code here
    }
}, 5000); //Timer is in ms here.

অন্যথায়, নীচে আরও একটি পরিষ্কার দরকারী সমাধান হতে পারে:

new Handler().postDelayed(() -> 
{/*Do something here*/}, 
5000); //time in ms

5

সদ্য চালু হওয়া ল্যাম্বদা এক্সপ্রেশন ব্যবহার করে আপনি এটি আরও পরিষ্কার করতে পারেন:

new Handler().postDelayed(() -> {/*your code here*/}, time);

5

সুতরাং এই বিড়ালটিকে ত্বকে আটকানোর অনেকগুলি উপায় রয়েছে বলে এখানে কয়েকটি বিষয় বিবেচনা করতে হবে। যদিও উত্তরগুলি ইতিমধ্যে নির্বাচিত এবং নির্বাচিত দেওয়া হয়েছে। আমি মনে করি যে এটি "সংখ্যাগরিষ্ঠ নির্বাচিত সাধারণ উত্তর" এর কারণে যে কেউ ভুল পথে যেতে না পারে তার জন্য যথাযথ কোডিং গাইডলাইনসের সাথে এটি পুনর্বিবেচিত হওয়া গুরুত্বপূর্ণ।

সুতরাং প্রথমে সরল পোস্ট বিলম্বিত উত্তরটি নিয়ে আলোচনা করা যাক এই থ্রেডের সামগ্রিকভাবে বিজয়ী নির্বাচিত উত্তর।

কয়েকটি বিষয় বিবেচনা করতে হবে। পোস্ট বিলম্বের পরে, আপনি মেমরি ফাঁস, মৃত অবজেক্টস, জীবনচক্রগুলি যা চলে গেছে এবং আরও অনেক কিছু মুখোমুখি হতে পারেন। সুতরাং এটি সঠিকভাবে পরিচালনা করাও গুরুত্বপূর্ণ। আপনি এটি বেশ কয়েকটি উপায়ে করতে পারেন।

আধুনিক বিকাশের স্বার্থে, আমি কেটলিনে সরবরাহ করব

কলব্যাকে ইউআই থ্রেড ব্যবহার করার এবং আপনার কলব্যাকটি যখন আঘাত করবেন তখন আপনার কার্যকলাপটি এখনও জীবিত এবং ভাল রয়েছে তা নিশ্চিত করার একটি সাধারণ উদাহরণ এখানে।

  Handler(Looper.getMainLooper()).postDelayed({
            if(activity != null && activity?.isFinishing == false){
                txtNewInfo.visibility = View.GONE
            }
        }, NEW_INFO_SHOW_TIMEOUT_MS)

তবে এটি এখনও নিখুঁত নয় কারণ যদি কার্যকলাপটি চলে যায় তবে আপনার কলব্যাকটি আঘাত করার কোনও কারণ নেই। সুতরাং এর চেয়ে ভাল উপায় হ'ল এটির একটি রেফারেন্স রাখা এবং এটির মতো কলব্যাকগুলি সরিয়ে দেওয়া।

    private fun showFacebookStylePlus1NewsFeedOnPushReceived(){
        A35Log.v(TAG, "showFacebookStylePlus1NewsFeedOnPushReceived")
        if(activity != null && activity?.isFinishing == false){
            txtNewInfo.visibility = View.VISIBLE
            mHandler.postDelayed({
                if(activity != null && activity?.isFinishing == false){
                    txtNewInfo.visibility = View.GONE
                }
            }, NEW_INFO_SHOW_TIMEOUT_MS)
        }
    }

এবং অবশ্যই অনপজে ক্লিনআপ হ্যান্ডেল করুন যাতে এটি কলব্যাকটিতে না আসে।

    override fun onPause() {
        super.onPause()
        mHandler.removeCallbacks(null)
    }

এখন যেহেতু আমরা স্পষ্টতই কথা বললাম, আসুন আমরা আধুনিক দিনের কর্টাইনস এবং কোটলিন :) এর সাথে একটি ক্লিনার বিকল্প সম্পর্কে কথা বলি :)। আপনি যদি এখনও এগুলি ব্যবহার না করেন তবে আপনি সত্যিই অনুপস্থিত।

   fun doActionAfterDelay() 
        launch(UI) {
            delay(MS_TO_DELAY)           
            actionToTake()
        }
    }

অথবা আপনি যদি সর্বদা সেই পদ্ধতিতে কোনও ইউআই লঞ্চ করতে চান তবে আপনি কেবল তা করতে পারেন:

  fun doActionAfterDelay() = launch(UI){ 
      delay(MS_TO_DELAY)           
      actionToTake()
  }

অবশ্যই পোস্টডিলিয়েডের মতো আপনাকেও নিশ্চিত করতে হয়েছিল যে আপনি বাতিল করতে পেরেছেন তাই আপনি বিলম্ব কলের পরে ক্রিয়াকলাপ চেক করতে পারেন বা অন্য রুটের মতোই আপনি অনপস এ এটি বাতিল করতে পারেন।

var mDelayedJob: Job? = null
fun doActionAfterDelay() 
   mDelayedJob = launch(UI) {
            try {
               delay(MS_TO_DELAY)           
               actionToTake()
            }catch(ex: JobCancellationException){
                showFancyToast("Delayed Job canceled", true, FancyToast.ERROR, "Delayed Job canceled: ${ex.message}")
            }
        }
   }
}

// হ্যান্ডেল ক্লিনআপ

override fun onPause() {
   super.onPause()
   if(mDelayedJob != null && mDelayedJob!!.isActive) {
      A35Log.v(mClassTag, "canceling delayed job")
      mDelayedJob?.cancel() //this should throw CancelationException in coroutine, you can catch and handle appropriately
   }
}

আপনি যদি পদ্ধতিটির স্বাক্ষরে লঞ্চ (ইউআই) রাখেন তবে কোডের কলিং লাইনে কাজ নির্ধারিত হতে পারে।

তাই গল্পের নৈতিকতাটি হ'ল আপনার বিলম্বিত ক্রিয়াকলাপগুলির সাথে সুরক্ষিত থাকা, আপনার কলব্যাকগুলি সরিয়ে ফেলার বিষয়ে নিশ্চিত হওয়া বা আপনার চাকুরী বাতিল করা এবং অবশ্যই আপনার বিলম্ব কলব্যাকের আইটেমগুলির স্পর্শ করার জন্য আপনার কাছে সঠিক জীবনচক্র রয়েছে তা নিশ্চিত করুন। Coroutines এছাড়াও বাতিল কর্মের প্রস্তাব।

এছাড়াও লক্ষণীয় যে আপনার সাধারণত কর্টিনগুলির সাথে আসা বিভিন্ন ব্যতিক্রমগুলি পরিচালনা করতে হবে। উদাহরণস্বরূপ, একটি বাতিলকরণ, একটি ব্যতিক্রম, একটি সময়সীমা, আপনি যেটি ব্যবহারের সিদ্ধান্ত নেন। যদি আপনি সত্যিই কর্টিনগুলি ব্যবহার শুরু করার সিদ্ধান্ত নেন তবে এখানে আরও উন্নত উদাহরণ।

   mLoadJob = launch(UI){
            try {
                //Applies timeout
                withTimeout(4000) {
                    //Moves to background thread
                    withContext(DefaultDispatcher) {
                        mDeviceModelList.addArrayList(SSDBHelper.getAllDevices())
                    }
                }

                //Continues after async with context above
                showFancyToast("Loading complete", true, FancyToast.SUCCESS)
            }catch(ex: JobCancellationException){
                showFancyToast("Save canceled", true, FancyToast.ERROR, "Save canceled: ${ex.message}")
            }catch (ex: TimeoutCancellationException) {
                showFancyToast("Timed out saving, please try again or press back", true, FancyToast.ERROR, "Timed out saving to database: ${ex.message}")
            }catch(ex: Exception){
                showFancyToast("Error saving to database, please try again or press back", true, FancyToast.ERROR, "Error saving to database: ${ex.message}")
            }
        }

1
কোনও সমস্যা নেই রাজীব, আমি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে এবং উল্লেখ করব যে লাইভ ডেটা ব্যবহার কর্টাইনগুলি ক্লিনআপ কলগুলি এড়ানোর জন্য জীবনচক্র সচেতন এবং স্ব-বাতিল হতে পারে, তবে একটি উত্তরে খুব বেশি শিক্ষণীয় বাঁক ফেলে দিতে চাই না;)
স্যাম

3

আমি এটিকে কল করার জন্য সহজ পদ্ধতি তৈরি করেছি।

public static void CallWithDelay(long miliseconds, final Activity activity, final String methodName)
    {
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                try {
                    Method method =  activity.getClass().getMethod(methodName);
                    method.invoke(activity);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }, miliseconds);
    }

এটি ব্যবহার করতে, কেবল কল করুন: .CallWithDelay(5000, this, "DoSomething");


3
এই ধরনের একটি মৌলিক কাজের প্রতিচ্ছবি?
সর্বোচ্চ Ch

যেহেতু প্রশ্নটি আইওএসের মতোই কল করার পদ্ধতি performSelector। এটি করার সেরা উপায়।
হেলমিবি

3

আপনি পাবেন যখন নীচে এক কাজ করে,

জাভা.লাং.রুনটাইম এক্সসেপশন: থ্রেডের ভিতরে হ্যান্ডলার তৈরি করতে পারে না যা লোপার.প্রিয়প্রে () বলে না

final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

3

কোটলিন ব্যবহার করে, আমরা নিম্নলিখিতগুলি দ্বারা সম্পাদন করতে পারি

Handler().postDelayed({
    // do something after 1000ms 
}, 1000)

2

এটি ব্যবহার করা খুব সহজ CountDownTimer। আরও তথ্যের জন্য https://developer.android.com/references/android/os/CountDownTimer.html

import android.os.CountDownTimer;

// calls onTick every second, finishes after 3 seconds
new CountDownTimer(3000, 1000) { 

   public void onTick(long millisUntilFinished) {
      Log.d("log", millisUntilFinished / 1000);
   }

   public void onFinish() {
      // called after count down is finished
   } 
}.start();

2

আপনি যদি আরএক্সএন্ড্রয়েড ব্যবহার করেন তবে থ্রেড এবং ত্রুটি হ্যান্ডলিং অনেক সহজ হয়ে যায়। নিম্নলিখিত কোডটি বিলম্বের পরে কার্যকর করে

   Observable.timer(delay, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(aLong -> {
           // Execute code here
        }, Throwable::printStackTrace);

1

প্রত্যেকে নতুন চালানোযোগ্য বা বার্তা এতে পোস্ট করার আগে হ্যান্ডলারটি পরিষ্কার করতে ভুলে গেছে বলে মনে হয়। যাইহোক তারা সম্ভাব্যভাবে জমা হতে পারে এবং খারাপ আচরণের কারণ হতে পারে।

handler.removeMessages(int what);
// Remove any pending posts of messages with code 'what' that are in the message queue.

handler.removeCallbacks(Runnable r)
// Remove any pending posts of Runnable r that are in the message queue.

1

এখানে আরও কৌতূহলোদ্দীপক উপায়: চলমান পরিবর্তন UI উপাদানগুলি বাদ দিলে এটি ব্যতিক্রম হয় না।

public class SimpleDelayAnimation extends Animation implements Animation.AnimationListener {

    Runnable callBack;

    public SimpleDelayAnimation(Runnable runnable, int delayTimeMilli) {
        setDuration(delayTimeMilli);
        callBack = runnable;
        setAnimationListener(this);
    }

    @Override
    public void onAnimationStart(Animation animation) {

    }

    @Override
    public void onAnimationEnd(Animation animation) {
        callBack.run();
    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }
}

আপনি এনিমেশনটিকে এভাবে কল করতে পারেন:

view.startAnimation(new SimpleDelayAnimation(delayRunnable, 500));

অ্যানিমেশন যে কোনও দৃশ্যের সাথে সংযুক্ত করতে পারে।



1

আমি জিনিস ক্লিনার পছন্দ করি: আপনার পদ্ধতির ভিতরে ব্যবহারের জন্য এখানে আমার বাস্তবায়ন, ইনলাইন কোড

new Handler().postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

0

অ্যান্ড্রয়েডে একটি উপযুক্ত সমাধান:

private static long SLEEP_TIME = 2 // for 2 second
.
.
MyLauncher launcher = new MyLauncher();
            launcher.start();
.
.
private class MyLauncher extends Thread {
        @Override
        /**
         * Sleep for 2 seconds as you can also change SLEEP_TIME 2 to any. 
         */
        public void run() {
            try {
                // Sleeping
                Thread.sleep(SLEEP_TIME * 1000);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            //do something you want to do
           //And your code will be executed after 2 second
        }
    }

0

অনুরূপ সমাধান কিন্তু ব্যবহার করতে অনেক ক্লিনার

ক্লাসের বাইরে এই ফাংশনটি লিখুন

fun delay(duration: Long, `do`: () -> Unit) {

    Handler().postDelayed(`do`, duration)

}

ব্যবহার:

delay(5000) {
    //Do your work here
}

`কর` কি করে?
Skizo-ozᴉʞS

শুধু একটি নাম, কিছু সেখানে রাখুন। doএকটি ইনবিল্ট পদ্ধতি তাই আমাদের চলক নাম হিসাবে এটি ব্যবহার করতে use ব্যবহার করতে হবে
মনোহর রেড্ডি

ধন্যবাদ, তবে কেন এই পরিবর্তনশীল নামটি ব্যবহার করা হয়? মানে এর কাজ কী?
Skizo-ozᴉʞS

1
আমি do3 সেকেন্ড দেরি করার পরে
মনোহর রেড্ডি

0

অ্যান্ড্রয়েডে, আমরা কোনও ক্রিয়াকলাপের বিলম্বের জন্য কোটলিন কোডটি নীচে লিখতে পারি

class MainActivity : AppCompatActivity() {

private lateinit var handler: Handler

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    handler= Handler()
    handler.postDelayed({
        doSomething()
    },2000)
}

private fun doSomething() {
    Toast.makeText(this,"Hi! I am Toast Message",Toast.LENGTH_SHORT).show()
}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.