অ্যান্ড্রয়েডে বিলম্ব কীভাবে সেট করবেন?


164
public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId()){
        case R.id.rollDice:
            Random ranNum = new Random();
            int number = ranNum.nextInt(6) + 1;
            diceNum.setText(""+number);
            sum = sum + number;
            for(i=0;i<8;i++){
                for(j=0;j<8;j++){

                    int value =(Integer)buttons[i][j].getTag();
                    if(value==sum){
                        inew=i;
                        jnew=j;

                        buttons[inew][jnew].setBackgroundColor(Color.BLACK);
                                                //I want to insert a delay here
                        buttons[inew][jnew].setBackgroundColor(Color.WHITE);
                         break;                     
                    }
                }
            }


            break;

        }
    }

পরিবর্তিত পটভূমির মধ্যে কমান্ডের মধ্যে আমি একটি বিলম্ব সেট করতে চাই। আমি একটি থ্রেড টাইমার ব্যবহার করার চেষ্টা করেছি এবং রান এবং ক্যাচ ব্যবহার করার চেষ্টা করেছি। কিন্তু এটি কাজ করছে না। আমি এই চেষ্টা করেছিলাম

 Thread timer = new Thread() {
            public void run(){
                try {
                                buttons[inew][jnew].setBackgroundColor(Color.BLACK);
                    sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

             }
           };
    timer.start();
   buttons[inew][jnew].setBackgroundColor(Color.WHITE);

তবে এটি কেবল কালো হয়ে উঠছে।

উত্তর:


499

এই কোড ব্যবহার করে দেখুন:

import android.os.Handler;
...
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 5s = 5000ms
        buttons[inew][jnew].setBackgroundColor(Color.BLACK);
    }
}, 5000);

1
এই সমাধানটি কোডের কয়েকটি লাইনে হ্যান্ডলারের সাথে আমার যে সমস্ত প্রশ্ন ছিল তা ব্যাখ্যা করেছিল।
সিয়েরিসিমো

45
আমি সবসময় এই পোস্টে ফিরে আসি কারণ প্রতিবার এটি লেখার জন্য আমি খুব অলস। ধন্যবাদ.
ইউজিন এইচ

ভাল এটা দেখতে খুব ভাল তবে আমি অপেক্ষা করার পরে বার্তা প্রচুর আছে। সুতরাং বহুবিধ পদক্ষেপ সমস্যা দেয়। কীভাবে একাধিক ট্র্যাডস সমস্যা সমাধান করতে পারে
মেহমেট

2
এই সমাধানটি একটি মেমরি ফাঁস তৈরি করে কারণ এটি অ স্থিতিশীল অভ্যন্তরীণ এবং বেনাম শ্রেণীর ব্যবহার করে যা স্পষ্টভাবে তার বাইরের শ্রেণি, ক্রিয়াকলাপের জন্য একটি রেফারেন্স ধারণ করে। আরও ভাল সমাধানের জন্য স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 1520887/… দেখুন ।
ট্রোনম্যান

সহজ জীবন জন্য লাইভ টেমপ্লেট @EugeneH ব্যবহারের stackoverflow.com/a/16870791/4565796
সাঈদ Arianmanesh

38

আপনি ব্যবহার করতে পারেন CountDownTimerযা পোস্ট করা অন্যান্য সমাধানের চেয়ে অনেক বেশি কার্যকর। আপনি এর onTick(long)পদ্ধতিটি ব্যবহার করে বিরতিতে নিয়মিত বিজ্ঞপ্তিও সরবরাহ করতে পারেন

30 সেকেন্ডের কাউন্টডাউন দেখানো এই উদাহরণটি একবার দেখুন

   new CountDownTimer(30000, 1000) {
         public void onFinish() {
             // When timer is finished 
             // Execute your code here
     }

     public void onTick(long millisUntilFinished) {
              // millisUntilFinished    The amount of time until finished.
     }
   }.start();

23

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

import android.os.Handler;


public class Utils {

    // Delay mechanism

    public interface DelayCallback{
        void afterDelay();
    }

    public static void delay(int secs, final DelayCallback delayCallback){
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                delayCallback.afterDelay();
            }
        }, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds.
    }
}

ব্যবহার:

// Call this method directly from java file

int secs = 2; // Delay in seconds

Utils.delay(secs, new Utils.DelayCallback() {
    @Override
    public void afterDelay() {
        // Do something after delay

    }
});

1
কেন? এটি খাঁটি ওভারহেড এবং জটিলতা ... কোনও
কিছুর

আমরা যদি ঘন ঘন বিলম্ব ব্যবহার করি, তবে বিলম্বের জন্য একটি নির্দিষ্ট বিন্যাস থাকা ভাল। আমি মনে করি না একটি অতিরিক্ত ইন্টারফেস এবং একটি পদ্ধতির কারণে খুব বেশি ওভারহেড রয়েছে।
aruke

18

Thread.sleep(millis)পদ্ধতিটি ব্যবহার করে ।


30
ইউআই থ্রেডে এটি করবেন না - অন্যান্য উপাদানগুলিও প্রতিক্রিয়া বন্ধ করতে পারে এবং পরে অনির্দেশ্য আচরণ করতে পারে
জ্যামকুলেট করুন

1
সতর্ক করার জন্য ধন্যবাদ. আমার দরকার ঠিক কী, ইউআই থ্রেডটি বিলম্ব করতে। আমার প্রয়োজনের জন্য নিখুঁত উত্তর। ধন্যবাদ।
হামিশ

7

আপনি যদি নিয়মিত সময়ের ব্যবধানে ইউআইতে কিছু করতে চান তবে খুব ভাল বিকল্পটি কাউন্টডাউনটাইমার ব্যবহার করা:

new CountDownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();

এটি হ্যান্ডলারের চেয়ে পরিষ্কার ।
আহসান

3

কোটলিনে হ্যান্ডলারের উত্তর:

1 - কোনও ফাইলের অভ্যন্তরে একটি শীর্ষ-স্তরের ফাংশন তৈরি করুন (উদাহরণস্বরূপ এমন ফাইল যা আপনার সমস্ত শীর্ষ স্তরের ফাংশন ধারণ করে):

fun delayFunction(function: ()-> Unit, delay: Long) {
    Handler().postDelayed(function, delay)
}

2 - তারপরে আপনার এটির যে কোনও জায়গায় কল করুন:

delayFunction({ myDelayedFunction() }, 300)

2

আপনি এটি ব্যবহার করতে পারেন:

import java.util.Timer;

এবং বিলম্বের জন্য নিজেই যুক্ত করুন:

 new Timer().schedule(
                    new TimerTask(){
                
                        @Override
                        public void run(){
                            
                        //if you need some code to run when the delay expires
                        }
                        
                    }, delay);

যেখানে delayভেরিয়েবলটি মিলি সেকেন্ডে থাকে; উদাহরণস্বরূপ delay5 সেকেন্ড বিলম্বের জন্য 5000 এ সেট করুন ।


0

এখানে একটি উদাহরণ যেখানে আমি ব্যাকগ্রাউন্ড চিত্রটি 2 সেকেন্ডের আলফা বিবর্ণ দেরি করে 2 থেকে দ্বিতীয় ইমেজটিতে 2 ই ফ্যাডইনে মূল ইমেজটির ফিডআউটটি দিয়ে এক থেকে অন্যটিতে পরিবর্তন করি।

    public void fadeImageFunction(View view) {

    backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
    backgroundImage.animate().alpha(0f).setDuration(2000);

    // A new thread with a 2-second delay before changing the background image
    new Timer().schedule(
            new TimerTask(){
                @Override
                public void run(){
                    // you cannot touch the UI from another thread. This thread now calls a function on the main thread
                    changeBackgroundImage();
                }
            }, 2000);
   }

// this function runs on the main ui thread
private void changeBackgroundImage(){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
            backgroundImage.setImageResource(R.drawable.supes);
            backgroundImage.animate().alpha(1f).setDuration(2000);
        }
    });
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.