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


325

কেউ কি প্রতি সেকেন্ড বা তার পরে টেক্সটফিল্ড আপডেট করার সহজ উদাহরণ দিতে পারে?

আমি একটি উড়ন্ত বল তৈরি করতে চাই এবং প্রতি সেকেন্ডে বল স্থানাঙ্কগুলি গণনা / আপডেট করতে হবে, এজন্যই আমাকে কিছু টাইমার প্রয়োজন।

আমি এখান থেকে কিছু পাই না ।


14
এই শ্রেণিটি সহায়তা করতে পারে: developer.android.com/references/android/os/CountDownTimer.html
পরমবীর সিং

উত্তর:


463

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


import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Handler.Callback;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class main extends Activity {
    TextView text, text2, text3;
    long starttime = 0;
    //this  posts a message to the main thread from our timertask
    //and updates the textfield
   final Handler h = new Handler(new Callback() {

        @Override
        public boolean handleMessage(Message msg) {
           long millis = System.currentTimeMillis() - starttime;
           int seconds = (int) (millis / 1000);
           int minutes = seconds / 60;
           seconds     = seconds % 60;

           text.setText(String.format("%d:%02d", minutes, seconds));
            return false;
        }
    });
   //runs without timer be reposting self
   Handler h2 = new Handler();
   Runnable run = new Runnable() {

        @Override
        public void run() {
           long millis = System.currentTimeMillis() - starttime;
           int seconds = (int) (millis / 1000);
           int minutes = seconds / 60;
           seconds     = seconds % 60;

           text3.setText(String.format("%d:%02d", minutes, seconds));

           h2.postDelayed(this, 500);
        }
    };

   //tells handler to send a message
   class firstTask extends TimerTask {

        @Override
        public void run() {
            h.sendEmptyMessage(0);
        }
   };

   //tells activity to run on ui thread
   class secondTask extends TimerTask {

        @Override
        public void run() {
            main.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                   long millis = System.currentTimeMillis() - starttime;
                   int seconds = (int) (millis / 1000);
                   int minutes = seconds / 60;
                   seconds     = seconds % 60;

                   text2.setText(String.format("%d:%02d", minutes, seconds));
                }
            });
        }
   };


   Timer timer = new Timer();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView)findViewById(R.id.text);
        text2 = (TextView)findViewById(R.id.text2);
        text3 = (TextView)findViewById(R.id.text3);

        Button b = (Button)findViewById(R.id.button);
        b.setText("start");
        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Button b = (Button)v;
                if(b.getText().equals("stop")){
                    timer.cancel();
                    timer.purge();
                    h2.removeCallbacks(run);
                    b.setText("start");
                }else{
                    starttime = System.currentTimeMillis();
                    timer = new Timer();
                    timer.schedule(new firstTask(), 0,500);
                    timer.schedule(new secondTask(),  0,500);
                    h2.postDelayed(run, 0);
                    b.setText("stop");
                }
            }
        });
    }

    @Override
    public void onPause() {
        super.onPause();
        timer.cancel();
        timer.purge();
        h2.removeCallbacks(run);
        Button b = (Button)findViewById(R.id.button);
        b.setText("start");
    }
}


মনে রাখার প্রধান বিষয় হ'ল ইউআই কেবলমাত্র মূল ইউআই থ্রেড থেকে সংশোধন করা যায় তাই হ্যান্ডলার বা ক্রিয়াকলাপটি ব্যবহার করুন un r

এখানে আমি পছন্দের পদ্ধতি হিসাবে বিবেচনা করি।


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class TestActivity extends Activity {

    TextView timerTextView;
    long startTime = 0;

    //runs without a timer by reposting this handler at the end of the runnable
    Handler timerHandler = new Handler();
    Runnable timerRunnable = new Runnable() {

        @Override
        public void run() {
            long millis = System.currentTimeMillis() - startTime;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds = seconds % 60;

            timerTextView.setText(String.format("%d:%02d", minutes, seconds));

            timerHandler.postDelayed(this, 500);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity);

        timerTextView = (TextView) findViewById(R.id.timerTextView);

        Button b = (Button) findViewById(R.id.button);
        b.setText("start");
        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Button b = (Button) v;
                if (b.getText().equals("stop")) {
                    timerHandler.removeCallbacks(timerRunnable);
                    b.setText("start");
                } else {
                    startTime = System.currentTimeMillis();
                    timerHandler.postDelayed(timerRunnable, 0);
                    b.setText("stop");
                }
            }
        });
    }

  @Override
    public void onPause() {
        super.onPause();
        timerHandler.removeCallbacks(timerRunnable);
        Button b = (Button)findViewById(R.id.button);
        b.setText("start");
    }

}



1
@ ডেভ.বি, দুর্দান্ত উদাহরণের জন্য ধন্যবাদ। আপনি বর্ণিত অন্যান্যগুলির তুলনায় একটি পদ্ধতি ব্যবহার করার কোনও সুবিধা / অসুবিধা আছে কি?
গৌতম

2
@ গৌতম আমি বিশ্বাস করি যে উপরের সমস্ত পদ্ধতি একইভাবে সম্পাদন করে। আমি ব্যক্তিগতভাবে রান রানযোগ্য এবং এইচ 2 হ্যান্ডলারের সাথে উপরে বর্ণিত হ্যান্ডলার পদ্ধতিটিকে পছন্দ করি কারণ এটি অ্যান্ড্রয়েড বিকাশকারী সাইটের দ্বারা নির্ধারিত একটি এবং আমার মতে এটিও সবচেয়ে মার্জিত।
ডেভ.বি

6
আপনার পছন্দের পদ্ধতিটি বাকী কোড থেকে আলাদা করে রাখা ভাল লাগবে। আপনার পছন্দ মতো উপায় দেখানোর একটি উদাহরণ থাকতে পারে এবং অন্যটি বিকল্পগুলি দেখায়। তিনটি পদ্ধতি এক সাথে থাকার ফলে কী হচ্ছে তা বোঝা শক্ত করে তোলে (আমার মতো অ্যান্ড্রয়েড নবাগতের জন্য বিশেষত)। সম্ভবত যদিও খুব বেশি জিজ্ঞাসা করছেন :)
জেসি অ্যালড্রিজ

4
@ জেসএল্ড্রিজ ভাল ধারণা। আমি এগিয়ে গিয়ে কেবল পছন্দের পদ্ধতির সাথে কোড যুক্ত করেছি।
ডেভ.বি

1
@ ব্লুজেম আমি সৎভাবে এটি সম্পর্কে ভাবিনি তবে হ্যাঁ এটি কার্যকর হবে।
ডেভ.বি

84

এটা সহজ! আপনি নতুন টাইমার তৈরি করুন।

Timer timer = new Timer();

তারপরে আপনি টাইমার টাস্কটি বাড়িয়ে দিন

class UpdateBallTask extends TimerTask {
   Ball myBall;

   public void run() {
       //calculate the new position of myBall
   }
}

এবং তারপরে কিছু আপডেটের বিরতি দিয়ে টাইমারটিতে নতুন কাজটি যুক্ত করুন

final int FPS = 40;
TimerTask updateBall = new UpdateBallTask();
timer.scheduleAtFixedRate(updateBall, 0, 1000/FPS);

দাবি অস্বীকার: এটি আদর্শ সমাধান নয়। এটি টাইমার ক্লাস ব্যবহার করে সমাধান (যেমন ওপি দ্বারা জিজ্ঞাসা করা হয়েছে)। অ্যান্ড্রয়েড এসডিকে, হ্যান্ডলার ক্লাসটি ব্যবহার করার প্রস্তাব দেওয়া হয় (স্বীকৃত উত্তরের উদাহরণ রয়েছে)।


1
উপরের পোস্টটি পড়লে আপনি দেখতে পাবেন কেন এটি একটি আদর্শ সমাধান নয়
ডেভ.বি

2
অবশ্যই. ওপি টাইমারটাস্ক দিয়ে এটি করতে চেয়েছিল, যা আমি খেলায় ব্যবহার করার পরামর্শ দেব না।
কথাসাহিত্য

3
তাই না? ওপি কীভাবে এটি চেয়েছিল তা নির্দিষ্ট করে নি । তারা এমন একটি নিবন্ধের সাথে লিঙ্ক করেছেন যা টাইমারটাস্ক ব্যবহার করেছিল তবে তারা এটি অনুরোধ করেনি যে এটি সেভাবেই করা হোক।
টুলমেকারস্টেভ

1
অনেক সাহায্য করেছেন, ধন্যবাদ @ ফিকশন
নাভিদ আহমদ

1
মহান উত্তর অনুসরণ করা সহজ।
JMASTER বি

64

আপনার যদি নিজের কোডটি ইউআই থ্রেডে চালানোর প্রয়োজন হয় (এবং টাইমার থ্রেডে নয়) তবে ব্লগটি একবার দেখুন: http://steve.odyfamily.com/?p=12

public class myActivity extends Activity {
private Timer myTimer;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    myTimer = new Timer();
    myTimer.schedule(new TimerTask() {          
        @Override
        public void run() {
            TimerMethod();
        }

    }, 0, 1000);
}

private void TimerMethod()
{
    //This method is called directly by the timer
    //and runs in the same thread as the timer.

    //We call the method that will work with the UI
    //through the runOnUiThread method.
    this.runOnUiThread(Timer_Tick);
}


private Runnable Timer_Tick = new Runnable() {
    public void run() {

    //This method runs in the same thread as the UI.               

    //Do something to the UI thread here

    }
};
}

সম্পূর্ণতার জন্য আপনি সম্ভবত টাইমার থামাতে কী করবেন তা উল্লেখ করতে পারেন এবং এটি আবার চালু করতে পারেন। : (আমি এখানে প্রয়োজনীয় তথ্য পাওয়া stackoverflow.com/questions/11550561/... )
RenniePet

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

অবশ্যই, সমস্ত পদক্ষেপগুলি বোঝার জন্য এটি কেবলমাত্র একটি ডিড্যাক্টিক পদ্ধতি। আমি এই স্ট্যান্ডার্ডটি একটি পঠনযোগ্য কোড রাখার পরামর্শ দিচ্ছি।
মীর জেরেনস্ট্যাড্ট

41

যদি কেউ কেবল পথেই অন্তরগুলিতে নিয়মিত বিজ্ঞপ্তিগুলি সহ ভবিষ্যতে কোনও সময় পর্যন্ত একটি গণনা নির্ধারণ করতে চায় তবে আপনি API স্তর 1 থেকে পাওয়া কাউন্টডাউনটাইমার শ্রেণিটি ব্যবহার করতে পারেন ।

new CountDownTimer(30000, 1000) {
    public void onTick(long millisUntilFinished) {
        editText.setText("Seconds remaining: " + millisUntilFinished / 1000);
    }

    public void onFinish() {
        editText.setText("Done");
    }
}.start();

2
কাউন্টডাউনটাইমার কেবল তখনই বোধগম্য হয় যদি আপনি জানেন যে বেশ কয়েকটি মৃত্যুদন্ড কার্যকর করার পরে আপনি এটি চলে যেতে চান। এটি একটি সাধারণ বা বিশেষভাবে নমনীয় নয়। আরও সাধারণ হ'ল এমন টাইমার যা চিরতরে পুনরাবৃত্তি করে (যা আপনি আর প্রয়োজন না হলে বাতিল করেন), বা হ্যান্ডলার যা একবার চালায় এবং তারপরে আবার প্রয়োজন হয় যদি আবার নিজেকে শুরু করে। অন্যান্য উত্তর দেখুন।
টুলমেকারস্টেভ

1
আপনি পুরোপুরি ঠিক বলেছেন। শ্রেণীর নাম থেকে এটি সমাপ্ত হওয়া অবধি টাইমার টিকিংয়ের এক সময় গণনা সরবরাহ করে এবং অবশ্যই এটি বাস্তবায়নে হ্যান্ডলার ব্যবহার করে।
আহমেদ হেগজি

মিলিসেকেন্ডগুলি কীভাবে প্রদর্শন করবেন? বিন্যাসে SS:MiMi? ধন্যবাদ
রুচির বড়োনিয়া

26

এটি একটি টাইমার জন্য কিছু সহজ কোড:

Timer timer = new Timer();
TimerTask t = new TimerTask() {       
    @Override
    public void run() {

        System.out.println("1");
    }
};
timer.scheduleAtFixedRate(t,1000,1000);

12

আমি মনে করি আপনি এটি আরএক্স উপায়ে করতে পারেন:

 timerSubscribe = Observable.interval(1, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Long>() {
                @Override
                public void call(Long aLong) {
                      //TODO do your stuff
                }
            });

এবং এটিকে বাতিল করুন:

timerSubscribe.unsubscribe();

আরএক্স টাইমার http://reactivex.io/docamentation/operators/timer.html


10

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

সবার আগে, টাইমার শ্রেণি জাভা 9 এ অবচয় করা হবে (গৃহীত উত্তরটি পড়ুন)

সরকারী প্রস্তাব উপায় ব্যবহার করা ScheduledThreadPoolExecutor যা বেশি কার্যকর এবং বৈশিষ্ট্য সমৃদ্ধ যে অতিরিক্ত একটি প্রদত্ত বিলম্বের পর চালানোর সময়সূচি কমান্ড করতে পারেন, অথবা কিছু সময় অন্তর চালানো। এছাড়াও, এটি থ্রেডপুলএক্সেকিউটারের অতিরিক্ত নমনীয়তা এবং ক্ষমতা দেয়।

এখানে সরল কার্যকারিতা ব্যবহারের একটি উদাহরণ।

  1. নির্বাহক পরিষেবা তৈরি করুন:

    final ScheduledExecutorService SCHEDULER = Executors.newScheduledThreadPool(1);
  2. আপনি চালানোর যোগ্য শিডিউল:

    final Future<?> future = SCHEDULER.schedule(Runnable task, long delay,TimeUnit unit);
  3. আপনি এখন futureটাস্কটি বাতিল করতে ব্যবহার করতে পারেন বা উদাহরণস্বরূপ এটি সম্পন্ন হয়েছে কিনা তা পরীক্ষা করতে পারেন:

    future.isDone();

আশা করি অ্যান্ড্রয়েডে কোনও টাস্ক তৈরি করার জন্য আপনি এটি দরকারী পাবেন।

সম্পূর্ণ উদাহরণ:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Future<?> sampleFutureTimer = scheduler.schedule(new Runnable(), 120, TimeUnit.SECONDS);
if (sampleFutureTimer.isDone()){
    // Do something which will save world.
}

8

আমি অবাক হয়েছি যে আরএক্সজেভা 2 এর সাথে সমাধানের উল্লেখ করার মতো কোনও উত্তর নেই । এটি সত্যিই সহজ এবং অ্যান্ড্রয়েডে টাইমার সেটআপ করার একটি সহজ উপায় সরবরাহ করে।

প্রথমে গ্রেডল নির্ভরতা নির্ধারণ করতে হবে, যদি আপনি ইতিমধ্যে এটি না করেন:

implementation "io.reactivex.rxjava2:rxjava:2.x.y"

(প্রতিস্থাপন xএবং yসঙ্গে বর্তমান সংস্করণ সংখ্যা )

যেহেতু আমাদের কেবল একটি সহজ, অ-পুনরাবৃত্তি করার কাজ রয়েছে , তাই আমরা Completableঅবজেক্টটি ব্যবহার করতে পারি :

Completable.timer(2, TimeUnit.SECONDS, Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(() -> {
            // Timer finished, do something...
        });

পুনর্বার কাজটি করার জন্য , আপনি Observableএকইভাবে ব্যবহার করতে পারেন :

Observable.interval(2, TimeUnit.SECONDS, Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(tick -> {
            // called every 2 seconds, do something...
        }, throwable -> {
            // handle error
        });

Schedulers.computation()আমাদের টাইমারটি ব্যাকগ্রাউন্ড থ্রেডে চলছে এবং .observeOn(AndroidSchedulers.mainThread())তা টাইমার সমাপ্তির পরে চালানো কোডটি মূল থ্রেডে সম্পন্ন হবে তা নিশ্চিত করে।

অযাচিত মেমোরি ফাঁস এড়াতে, ক্রিয়াকলাপ / খণ্ডটি নষ্ট হয়ে গেলে আপনার সদস্যতা ত্যাগ করা নিশ্চিত করা উচিত।


4
এটিই সবচেয়ে পরিষ্কার পদ্ধতি!
কনস্টান্টিন

কিভাবে এই বাতিল হয়? অর্থাত্ যখন ব্যবহারকারী ইউআই-তে [স্টপ] বোতাম টিপান এবং কার্যকর করার আগে কমপ্লেটেবল বাতিল হয়ে যায়।
কেউ সোমবার কোথাও

@ সোমোনসোহোমেসার ওয়েয়ারেবলের Subscriptionমাধ্যমে .subscribe()পদ্ধতিতে ফিরে আসা কেবল সংরক্ষণ করুন এবং subscription.unsubscribe()আপনি টাইমারটি থামাতে চাইলে কল করুন।
মাইকার

2

তিনি হ'ল সহজ সমাধান, আমার অ্যাপ্লিকেশনটিতে কাজ করে।

  public class MyActivity extends Acitivity {

    TextView myTextView;
    boolean someCondition=true;

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_activity);

            myTextView = (TextView) findViewById(R.id.refreshing_field);

            //starting our task which update textview every 1000 ms
            new RefreshTask().execute();



        }

    //class which updates our textview every second

    class RefreshTask extends AsyncTask {

            @Override
            protected void onProgressUpdate(Object... values) {
                super.onProgressUpdate(values);
                String text = String.valueOf(System.currentTimeMillis());
                myTextView.setText(text);

            }

            @Override
            protected Object doInBackground(Object... params) {
                while(someCondition) {
                    try {
                        //sleep for 1s in background...
                        Thread.sleep(1000);
                        //and update textview in ui thread
                        publishProgress();
                    } catch (InterruptedException e) {
                        e.printStackTrace(); 

                };
                return null;
            }
        }
    }

2

আপনি চান আপনার ইউআই আপডেটগুলি ইতিমধ্যে বিদ্যমান ইউআই থ্রেডে ঘটুক।

সর্বোত্তম উপায় হ্যান্ডলার ব্যবহার করা যা দেরী হওয়ার পরে রান্নেবল চালানোর জন্য পোস্টডলেড ব্যবহার করে (প্রতিটি রান পরবর্তী সময়সূচী); অপসারণ কলব্যাক্স দিয়ে কলব্যাক সাফ করুন।

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


দুর্ভাগ্যক্রমে, আপনার লিঙ্কটি মারা গেছে। আমি দ্রুত সঠিক নিবন্ধটি খুঁজে পাচ্ছি না।
লেকেনস্টেইন


1

এখানে একটি সহজ নির্ভরযোগ্য উপায় ...

আপনার ক্রিয়াকলাপে নিম্নলিখিত কোডটি রাখুন এবং আপনার ক্রিয়াকলাপটি "পুনরায় চালু" অবস্থায় থাকা অবস্থায় টিক () পদ্ধতিটি প্রতি সেকেন্ডে ইউআই থ্রেডে কল করা হবে। অবশ্যই, আপনি যা চান তা করতে টিক () পদ্ধতিটি পরিবর্তন করতে পারেন, বা আরও বা কম ঘন ঘন ডাকা হতে পারেন।

@Override
public void onPause() {
    _handler = null;
    super.onPause();
}

private Handler _handler;

@Override
public void onResume() {
    super.onResume();
    _handler = new Handler();
    Runnable r = new Runnable() {
        public void run() {
            if (_handler == _h0) {
                tick();
                _handler.postDelayed(this, 1000);
            }
        }

        private final Handler _h0 = _handler;
    };
    r.run();
}

private void tick() {
    System.out.println("Tick " + System.currentTimeMillis());
}

আপনার আগ্রহীদের জন্য, যদি আপনার ক্রিয়াকলাপটি বিরতি দেওয়া হয় এবং টিকের সময়কালে পুনরায় চালু করা হয় তবে দুটি টাইমার এক সাথে চলতে এড়াতে "_h0 = _ হ্যান্ডলার" কোডটি প্রয়োজনীয়।


2
কেন এই বিশ্রী না _h0পরিবর্তে পদ্ধতির removeCallbacksমধ্যে onPauseবাকিদের মত?
টুলমেকারস্টেভ

1

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

int secondsToRun = 999;

ValueAnimator timer = ValueAnimator.ofInt(secondsToRun);
timer.setDuration(secondsToRun * 1000).setInterpolator(new LinearInterpolator());
timer.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
    {
        @Override
        public void onAnimationUpdate(ValueAnimator animation)
        {
            int elapsedSeconds = (int) animation.getAnimatedValue();
            int minutes = elapsedSeconds / 60;
            int seconds = elapsedSeconds % 60;

            textView.setText(String.format("%d:%02d", minutes, seconds));
        }
    });
timer.start();

0

আপডেট লুপটি পরিচালনা করতে আপনাকে একটি থ্রেড তৈরি করতে হবে এবং এটি টেক্সারিয়া আপডেট করতে ব্যবহার করতে হবে। যদিও জটিল অংশটি হ'ল কেবলমাত্র মূল থ্রেডটি আসলে ইউআইকে সংশোধন করতে পারে তাই আপডেট লুপ থ্রেডটি আপডেট করার জন্য মূল থ্রেডকে সিগন্যাল করা প্রয়োজন। এটি একটি হ্যান্ডলার ব্যবহার করে করা হয়।

এই লিঙ্কটি দেখুন: http://developer.android.com/guide/topics/ui/dialogs.html# "দ্বিতীয় থ্রেড সহ উদাহরণস্বরূপ অগ্রগতি ডায়ালগ" শীর্ষক বিভাগটি ক্লিক করুন। এটি একটি পাঠ্যক্ষেত্রের পরিবর্তে অগ্রগতি কথোপকথন ছাড়া আপনার ঠিক কী করা দরকার তার একটি উদাহরণ।


এটি করবেন না। একটি সাধারণ টাইমার ক্লাস রয়েছে যা আপনার জন্য এটি করে। এবং এই প্রশ্নের অগ্রগতি ডায়ালগ, বা ডায়ালগ মোটেও কিছুই করার নেই।
ফালমারি

আপনি যে লিঙ্কটি পোস্ট করেছেন তার বিভাগটি আপনি দেখেছেন বা আপনি কি কেবল কথোপকথন শব্দটি দেখেছেন এবং ধরেছেন? কোডটি 100% প্রাসঙ্গিক। এছাড়াও এফওয়াইআই, আপনি যদি টাইমার ব্যবহার করেন তবে আপনি আপডেট লুপটি পরিচালনা করতে একটি থ্রেড তৈরি করছেন। আমার পোস্ট করা লিঙ্কটিতে বর্ণিত হিসাবে আপনাকে এখনও হ্যান্ডলারটি ব্যবহার করতে হবে।
নিক 21

দুর্ভাগ্যক্রমে, লিঙ্কযুক্ত পৃষ্ঠাটিতে উল্লিখিত শিরোনাম সহ আর কোনও বিভাগ নেই। কোডের সাথে লিঙ্ক করার সময়, সর্বদা আপনার উত্তরের মধ্যে সরাসরি স্নিপেটটি অন্তর্ভুক্ত করা উচিত।
টুলমেকারস্টেভ

0
void method(boolean u,int max)
{
    uu=u;
    maxi=max;
    if (uu==true)
    { 
        CountDownTimer uy = new CountDownTimer(maxi, 1000) 
  {
            public void onFinish()
            {
                text.setText("Finish"); 
            }

            @Override
            public void onTick(long l) {
                String currentTimeString=DateFormat.getTimeInstance().format(new Date());
                text.setText(currentTimeString);
            }
        }.start();
    }

    else{text.setText("Stop ");
}

2
হতে পারে কিছু কোড ইনডেন্টেশন এবং কোড ব্যাখ্যা কার্যকর হবে।
রাউল রেনে

0

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

package com.example.util.timer;

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

import android.app.Activity;

public class ActivityTimer {

    private Activity m_Activity;
    private boolean m_Enabled;
    private Timer m_Timer;
    private long m_Delay;
    private long m_Period;
    private ActivityTimerListener m_Listener;
    private ActivityTimer _self;
    private boolean m_FireOnce;

    public ActivityTimer() {
        m_Delay = 0;
        m_Period = 100;
        m_Listener = null;
        m_FireOnce = false;
        _self = this;
    }

    public boolean isEnabled() {
        return m_Enabled;
    }

    public void setEnabled(boolean enabled) {
        if (m_Enabled == enabled)
            return;

        // Disable any existing timer before we enable a new one
        Disable();

        if (enabled) {
            Enable();
        }
    }

    private void Enable() {
        if (m_Enabled)
            return;

        m_Enabled = true;

        m_Timer = new Timer();
        if (m_FireOnce) {
            m_Timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    OnTick();
                }
            }, m_Delay);
        } else {
            m_Timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    OnTick();
                }
            }, m_Delay, m_Period);
        }
    }

    private void Disable() {
        if (!m_Enabled)
            return;

        m_Enabled = false;

        if (m_Timer == null)
            return;

        m_Timer.cancel();
        m_Timer.purge();
        m_Timer = null;
    }

    private void OnTick() {
        if (m_Activity != null && m_Listener != null) {
            m_Activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    m_Listener.OnTimerTick(m_Activity, _self);
                }
            });
        }
        if (m_FireOnce)
            Disable();
    }

    public long getDelay() {
        return m_Delay;
    }

    public void setDelay(long delay) {
        m_Delay = delay;
    }

    public long getPeriod() {
        return m_Period;
    }

    public void setPeriod(long period) {
        if (m_Period == period)
            return;
        m_Period = period;
    }

    public Activity getActivity() {
        return m_Activity;
    }

    public void setActivity(Activity activity) {
        if (m_Activity == activity)
            return;
        m_Activity = activity;
    }

    public ActivityTimerListener getActionListener() {
        return m_Listener;
    }

    public void setActionListener(ActivityTimerListener listener) {
        m_Listener = listener;
    }

    public void start() {
        if (m_Enabled)
            return;
        Enable();
    }

    public boolean isFireOnlyOnce() {
        return m_FireOnce;
    }

    public void setFireOnlyOnce(boolean fireOnce) {
        m_FireOnce = fireOnce;
    }
}

ক্রিয়াকলাপে, আমার এই অন স্টার্টটি রয়েছে:

@Override
protected void onStart() {
    super.onStart();

    m_Timer = new ActivityTimer();
    m_Timer.setFireOnlyOnce(true);
    m_Timer.setActivity(this);
    m_Timer.setActionListener(this);
    m_Timer.setDelay(3000);
    m_Timer.start();
}

1
বাবু কি অ্যাক্টিভিটি টাইমারলিস্টনার? আমার এডিটি বান্ডেল বলেছিল যে এরকম কোনও শ্রেণি নেই।
সোরোকিন আন্দ্রে

0
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {

 CheckBox optSingleShot;
 Button btnStart, btnCancel;
 TextView textCounter;

 Timer timer;
 MyTimerTask myTimerTask;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  optSingleShot = (CheckBox)findViewById(R.id.singleshot);
  btnStart = (Button)findViewById(R.id.start);
  btnCancel = (Button)findViewById(R.id.cancel);
  textCounter = (TextView)findViewById(R.id.counter);

  btnStart.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View arg0) {

    if(timer != null){
     timer.cancel();
    }

    //re-schedule timer here
    //otherwise, IllegalStateException of
    //"TimerTask is scheduled already" 
    //will be thrown
    timer = new Timer();
    myTimerTask = new MyTimerTask();

    if(optSingleShot.isChecked()){
     //singleshot delay 1000 ms
     timer.schedule(myTimerTask, 1000);
    }else{
     //delay 1000ms, repeat in 5000ms
     timer.schedule(myTimerTask, 1000, 5000);
    }
   }});

  btnCancel.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    if (timer!=null){
     timer.cancel();
     timer = null;
    }
   }
  });

 }

 class MyTimerTask extends TimerTask {

  @Override
  public void run() {
   Calendar calendar = Calendar.getInstance();
   SimpleDateFormat simpleDateFormat = 
     new SimpleDateFormat("dd:MMMM:yyyy HH:mm:ss a");
   final String strDate = simpleDateFormat.format(calendar.getTime());

   runOnUiThread(new Runnable(){

    @Override
    public void run() {
     textCounter.setText(strDate);
    }});
  }

 }

}

.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:autoLink="web"
    android:text="http://android-er.blogspot.com/"
    android:textStyle="bold" />
<CheckBox 
    android:id="@+id/singleshot"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Single Shot"/>


আমি দেখতে পাচ্ছি যে আপনি মূল প্রশ্ন ও উত্তরগুলির বেশ কয়েক বছর পরে এটি যুক্ত করেছেন। দয়া করে এই উত্তরটি ইতিমধ্যে উপস্থিত অন্যান্য উত্তরগুলির সাথে কীভাবে তুলনা করা যায় তার ব্যাখ্যা যুক্ত করুন। আপনি কেন অন্যটিকে যুক্ত করলেন - কী লাভ / কখন কার্যকর / আপনি অন্যান্য উত্তরে কী ঘাটতি দেখেছেন?
টুলমেকারস্টেভ

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

0

আপনার যদি ইতিমধ্যে ডেল্টা সময় থাকে।

public class Timer {
    private float lastFrameChanged;
    private float frameDuration;
    private Runnable r;

    public Timer(float frameDuration, Runnable r) {
        this.frameDuration = frameDuration;
        this.lastFrameChanged = 0;
        this.r = r;
    }

    public void update(float dt) {
        lastFrameChanged += dt;

        if (lastFrameChanged > frameDuration) {
            lastFrameChanged = 0;
            r.run();
        }
    }
}

0

আমি টাইমার অ্যাবস্ট্রাক্ট করে এটিকে একটি পৃথক শ্রেণিতে পরিণত করেছি:

Timer.java

import android.os.Handler;

public class Timer {

    IAction action;
    Handler timerHandler = new Handler();
    int delayMS = 1000;

    public Timer(IAction action, int delayMS) {
        this.action = action;
        this.delayMS = delayMS;
    }

    public Timer(IAction action) {
        this(action, 1000);
    }

    public Timer() {
        this(null);
    }

    Runnable timerRunnable = new Runnable() {

        @Override
        public void run() {
            if (action != null)
                action.Task();
            timerHandler.postDelayed(this, delayMS);
        }
    };

    public void start() {
        timerHandler.postDelayed(timerRunnable, 0);
    }

    public void stop() {
        timerHandler.removeCallbacks(timerRunnable);
    }
}

এবং Timerক্লাস আউট হিসাবে প্রধান ক্রিয়া নিষ্কাশন

IAction.java

public interface IAction {
    void Task();
}

এবং আমি এটি ঠিক এভাবে ব্যবহার করেছি:

MainActivity.java

public class MainActivity extends Activity implements IAction{
...
Timer timerClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
        ...
        timerClass = new Timer(this,1000);
        timerClass.start();
        ...
}
...
int i = 1;
@Override
public void Task() {
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            timer.setText(i + "");
            i++;
        }
    });
}
...
}

আমি আশা করি এটি সাহায্য করে 😊👌


0

আমি এইভাবে ব্যবহার করি:

String[] array={
       "man","for","think"
}; int j;

তারপরে অনক্রিটের নীচে

TextView t = findViewById(R.id.textView);

    new CountDownTimer(5000,1000) {

        @Override
        public void onTick(long millisUntilFinished) {}

        @Override
        public void onFinish() {
            t.setText("I "+array[j] +" You");
            j++;
            if(j== array.length-1) j=0;
            start();
        }
    }.start();

এই সমস্যাটি সমাধানের এটি সহজ উপায়।


0

যারা ক্রোনোমিটারের উপর নির্ভর করতে পারেন না তাদের জন্য আমি পরামর্শগুলির একটির মধ্যে একটি ইউটিলিটি ক্লাস করেছি:

public class TimerTextHelper implements Runnable {
   private final Handler handler = new Handler();
   private final TextView textView;
   private volatile long startTime;
   private volatile long elapsedTime;

   public TimerTextHelper(TextView textView) {
       this.textView = textView;
   }

   @Override
   public void run() {
       long millis = System.currentTimeMillis() - startTime;
       int seconds = (int) (millis / 1000);
       int minutes = seconds / 60;
       seconds = seconds % 60;

       textView.setText(String.format("%d:%02d", minutes, seconds));

       if (elapsedTime == -1) {
           handler.postDelayed(this, 500);
       }
   }

   public void start() {
       this.startTime = System.currentTimeMillis();
       this.elapsedTime = -1;
       handler.post(this);
   }

   public void stop() {
       this.elapsedTime = System.currentTimeMillis() - startTime;
       handler.removeCallbacks(this);
   }

   public long getElapsedTime() {
       return elapsedTime;
   }
 }

ব্যবহার করতে .. ঠিক করুন:

 TimerTextHelper timerTextHelper = new TimerTextHelper(textView);
 timerTextHelper.start();

.....

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