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


172

কোনও কাজ (যেটি আমি তৈরি করি যা ইউআই পরিবর্তন করে না) এটি বন্ধ করার জন্য অ্যান্ড্রয়েডে টাইমার সেট করার সঠিক উপায় কী? এটি জাভা উপায়ে ব্যবহার করুন: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html

অথবা অ্যান্ড্রয়েডের (অ্যান্ড্রয়েডের হ্যান্ডলার) আরও ভাল উপায় আছে?

উত্তর:


143

Java.util.Timer এবং java.util.TimerTask এর মাধ্যমে টাইমার ব্যবহার করার স্ট্যান্ডার্ড জাভা উপায় অ্যান্ড্রয়েডে দুর্দান্ত কাজ করে তবে আপনাকে সচেতন হওয়া উচিত যে এই পদ্ধতিটি একটি নতুন থ্রেড তৈরি করে।

আপনি খুব সুবিধাজনক হ্যান্ডলারের ক্লাস (android.os.Handler) ব্যবহার করে বিবেচনা করতে পারেন এবং এর মাধ্যমে sendMessageAtTime(android.os.Message, long)বা হ্যান্ডলারের কাছে বার্তা প্রেরণ করতে পারেন sendMessageDelayed(android.os.Message, long)। আপনি একবার বার্তা পেয়ে গেলে, আপনি পছন্দসই কাজগুলি চালাতে পারেন। দ্বিতীয় বিকল্প একটি তৈরি করতে হবে runnable বস্তু এবং হ্যান্ডলার এর ফাংশন মাধ্যমে এটি নির্দিষ্ট সময় নির্ধারণের postAtTime(java.lang.Runnable, long)বা postDelayed(java.lang.Runnable, long)


10
অ্যান্ড্রয়েডে জিনিসগুলি করার এটি ভুল উপায়। অ্যান্ড্রয়েডে, আপনি ভবিষ্যতে অনেক কার্য চালানোর জন্য অ্যালার্ম ম্যানেজার (বিকাশকারী.অ্যান্ড্রয়েড.com/references/android/app/AlarmManager.html) ব্যবহার করতে চান।
কুর্তিস নসবাউম

9
@ কুর্তিস নুসবাউম প্রশ্নটি ভবিষ্যতে কাজটি কতটা দূরে রয়েছে তা বলে না।
ক্রিস্টোফার পেরি

67
@ কুর্তিসনসবাউম এটি অগত্যা সত্য নয়, এটি প্রসঙ্গে নির্ভর করে। অ্যালার্ম ম্যানেজারের নথিগুলি বলে, "দ্রষ্টব্য: অ্যালার্ম ম্যানেজার এমন একটি ক্ষেত্রে আপনার অ্যাপ্লিকেশন কোডটি নির্দিষ্ট সময়ে চালিত করতে চান এমনকি আপনার অ্যাপ্লিকেশনটি বর্তমানে চলমান না থাকলেও তৈরি করা হয়েছে normal সাধারণ সময়সীমার ক্রিয়াকলাপের জন্য (টিক্স, সময়সীমা ইত্যাদি) হ্যান্ডলারটি ব্যবহার করা সহজ এবং আরও কার্যকর ""
ক্রিস্টোফার পেরি

5
@ সায়েন্সপ্রোডিজি আহ, আমি দেখছি। যথেষ্ট ফর্সা।
কুর্তিস নসবাউম

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

159

হ্যাঁ জাভা এর টাইমার ব্যবহার করা যেতে পারে , তবে প্রশ্নটি আরও ভাল উপায়ের জন্য জিজ্ঞাসা করে (মোবাইলের জন্য)। কোনটি ব্যাখ্যা করা হয় এখানে


স্ট্যাক ওভারফ্লোর জন্য:

যেহেতু টাইমার একটি নতুন থ্রেড তৈরি করে এটিকে ভারী হিসাবে বিবেচনা করা যেতে পারে,

ক্রিয়াকলাপটি হ্যান্ডলারটি চলাকালীন আপনার সাথে যা দরকার তা যদি একটি কল ফিরে আসে তবে এটি একটি এর সাথে একত্রে ব্যবহৃত হতে পারে

চলমান :

private final int interval = 1000; // 1 Second
private Handler handler = new Handler();
private Runnable runnable = new Runnable(){
    public void run() {
        Toast.makeText(MyActivity.this, "C'Mom no hands!", Toast.LENGTH_SHORT).show();
    }
};
...
handler.postAtTime(runnable, System.currentTimeMillis()+interval);
handler.postDelayed(runnable, interval);

বা একটি বার্তা

private final int EVENT1 = 1; 
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {         
        case Event1:
            Toast.makeText(MyActivity.this, "Event 1", Toast.LENGTH_SHORT).show();
            break;

        default:
            Toast.makeText(MyActivity.this, "Unhandled", Toast.LENGTH_SHORT).show();
            break;
        }
    }
};

...

Message msg = handler.obtainMessage(EVENT1);
handler.sendMessageAtTime(msg, System.currentTimeMillis()+interval);
handler.sendMessageDelayed(msg, interval);

আপনি যদি অন্য থ্রেড থেকে ইউআই থ্রেডে কোনও টুকরো কোড চালনা করতে চান তবে এই দিকটি ব্যবহার করা যেতে পারে।

আপনার ক্রিয়াকলাপটি না চলতে থাকলে যদি আপনার কল ফিরে পাওয়া দরকার তবে আপনি একটি অ্যালার্ম ম্যানেজার ব্যবহার করতে পারেন use


1
ওহ হ্যাঁ, আমি ঠিক এই উত্তর googled। দরকারী লিঙ্কের জন্য আমার upvote নিন।
ulidtko

1
লিঙ্কটি আপডেট করেছে, গুগল সম্পর্কে লিঙ্কগুলি বজায় রাখতে সমস্যা হচ্ছে talk
স্যামুয়েল

1
2007 এর এই নিবন্ধটি - এটি ভুল বলছে না তবে 3 বছরের বেশি বয়সী কোনও মোবাইল নিবন্ধ সম্পর্কে আমি সর্বদা সন্দেহ করি। বিষয়গুলি খুব দ্রুত পরিবর্তিত হয়।
স্ট্যাকওভারফ্লো হয়েছে

1
এটি যদি আপনার উত্তরটিতে আপনার লিঙ্কের মূল পয়েন্টগুলি উদ্ধৃত করতে পারে তবে এটি স্ট্যাকওভারফ্লোর মতো হবে।
n611x007

1
@ নেক্সা, আমার প্রতিক্রিয়াটিকে স্ট্যাকওভারফ্লোয়ের মতো করে তুলতে আমার দুটি সেন্ট।
স্যামুয়েল

131

আমি এটি দেখেছি, java.util.Timer টাইমার প্রয়োগের জন্য সবচেয়ে বেশি ব্যবহৃত হয়।

পুনরাবৃত্তি কাজের জন্য:

new Timer().scheduleAtFixedRate(task, after, interval);

কোনও কাজের একক রান করার জন্য:

new Timer().schedule(task, after);


প্রাথমিক কার্য সম্পাদনের সময়
হওয়ার পরে কার্য সম্পাদন করার পদ্ধতিটি
( কার্য সম্পাদনের পুনরাবৃত্তির সময়কাল )


9
আমি কেবল সময়টি মিলিসেকেন্ডে যুক্ত করব
উরি

2
Android এর জন্য দেব ডক্স scheduleAtFixedRate
n611x007

1
taskআপনার বর্গের উদাহরণ হতে পারে যা java.util.TimerTask এবং ওভাররাইড থেকে উত্তরাধিকার সূত্রে প্রাপ্ত void run()
n611x007

2
এত উর্ধ্বতন। আপনি এই করতে পারে। তবে @ সামুয়েল আরও ভাল উপায় বর্ণনা করে। তার জন্য "যা এখানে ব্যাখ্যা করা হয়েছে" লিঙ্কটি দেখুন। এছাড়াও, টাইমার থ্রেড থেকে ইউআই আপডেট করতে পারে না! এবং অন্য থ্রেডের মধ্যে এই অন্যান্য হ্যান্ডলার ভিত্তিক উত্তর দেখুন: (সাধারণ) stackoverflow.com/a/6702767/199364 , অথবা (শো বিভিন্ন বিকল্প) stackoverflow.com/a/4598737/199364
ToolmakerSteve

@ মেকফুল কারণ এটি সবসময় সুবিধার বিষয়ে নয়, এটি কোডের মান এবং দক্ষতা সম্পর্কে। এটি করার এই
উপায়টি

33

আমি আশা করি এটি একটি সহায়ক এবং অ্যান্ড্রয়েড কাউন্টডাউনটাইমার ক্লাস প্রয়োগের জন্য কম প্রচেষ্টা গ্রহণ করতে পারে

যেমন

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

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

1
এটি সবচেয়ে সহজ এবং ভিডিও প্লে
বিজয় কুমার কান্ত

17

সম্ভবত Timerconcept

new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interval

 public void onTick(long millisUntilFinished) {
  }
  public void onFinish() {
 }
}.start();

অথবা

পদ্ধতি 2 ::

প্রোগ্রাম টাইমার

ইনট নামের সময়ের একটি নতুন ভেরিয়েবল যুক্ত করুন। এটিকে 0. এ সেট করুন Main মেইনএকটিভিটি.জভাতে ক্রিয়াকলাপের জন্য নিম্নলিখিত কোডটি যুক্ত করুন।

//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {

    @Override
    public void run() {
        //Called each time when 1000 milliseconds (1 second) (the period parameter)
    }

},
//Set how long before to start calling the TimerTask (in milliseconds)
0,
//Set the amount of time between each execution (in milliseconds)
1000);

রান পদ্ধতিতে যান এবং নিম্নলিখিত কোড যুক্ত করুন।

//We must use this function in order to change the text view text
runOnUiThread(new Runnable() {

    @Override
    public void run() {
        TextView tv = (TextView) findViewById(R.id.main_timer_text);
        tv.setText(String.valueOf(time));
        time += 1;
    }

});

11

এটা পরিস্থিতিগত।

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

অন্যথায়, আপনার হ্যান্ডলার ব্যবহার করা উচিত।

দ্রষ্টব্য: অ্যালার্ম ম্যানেজার এমন ক্ষেত্রে তৈরি করা হয় যেখানে আপনি আপনার অ্যাপ্লিকেশন কোডটি নির্দিষ্ট সময়ে চালাতে চান, এমনকি আপনার অ্যাপ্লিকেশনটি বর্তমানে চলছে না। সাধারণ টাইমিং অপারেশনের জন্য (টিক্স, টাইমআউটস ইত্যাদি) হ্যান্ডলার ব্যবহার করা সহজ এবং অনেক বেশি দক্ষ।


11

এখানে আমরা যাচ্ছি .. আমাদের দুটি ক্লাসের প্রয়োজন হবে। আমি এমন একটি কোড পোস্ট করছি যা প্রতি 5 সেকেন্ড (5000 মিলি সেকেন্ড) পরে মোবাইল অডিও প্রোফাইল পরিবর্তন করে ...

আমাদের 1 ম শ্রেণি

public class ChangeProfileActivityMain extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Timer timer = new Timer();
        TimerTask updateProfile = new CustomTimerTask(ChangeProfileActivityMain.this);
        timer.scheduleAtFixedRate(updateProfile, 0, 5000);
    }

}

আমাদের ২ য় শ্রেণি

public class CustomTimerTask extends TimerTask {

    private AudioManager audioManager;
    private Context context;
    private Handler mHandler = new Handler();

    // Write Custom Constructor to pass Context
    public CustomTimerTask(Context con) {
        this.context = con;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        // your code starts here.
        // I have used Thread and Handler as we can not show Toast without starting new thread when we are inside a thread.
        // As TimePicker has run() thread running., So We must show Toast through Handler.post in a new Thread. Thats how it works in Android..
        new Thread(new Runnable() {
            @Override
            public void run() {
                audioManager = (AudioManager) context.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if(audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
                            audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                            Toast.makeText(context, "Ringer Mode set to Normal", Toast.LENGTH_SHORT).show();
                        } else {
                            audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                            Toast.makeText(context, "Ringer Mode set to Silent", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        }).start();

    }

}

5

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

ব্যবহারের উদাহরণ:

...{
public Handler uiHandler = new Handler();

  private Runnable runMethod = new Runnable()
    {
        public void run()
        {
              // do something
        }
    };

    timer = new UITimer(handler, runMethod, timeoutSeconds*1000);       
        timer.start();
}...

public class UITimer
{
    private Handler handler;
    private Runnable runMethod;
    private int intervalMs;
    private boolean enabled = false;
    private boolean oneTime = false;

    public UITimer(Handler handler, Runnable runMethod, int intervalMs)
    {
        this.handler = handler;
        this.runMethod = runMethod;
        this.intervalMs = intervalMs;
    }

    public UITimer(Handler handler, Runnable runMethod, int intervalMs, boolean oneTime)
    {
        this(handler, runMethod, intervalMs);
        this.oneTime = oneTime;
    }

    public void start()
    {
        if (enabled)
            return;

        if (intervalMs < 1)
        {
            Log.e("timer start", "Invalid interval:" + intervalMs);
            return;
        }

        enabled = true;
        handler.postDelayed(timer_tick, intervalMs);        
    }

    public void stop()
    {
        if (!enabled)
            return;

        enabled = false;
        handler.removeCallbacks(runMethod);
        handler.removeCallbacks(timer_tick);
    }

    public boolean isEnabled()
    {
        return enabled;
    }

    private Runnable timer_tick = new Runnable()
    {
        public void run()
        {
            if (!enabled)
                return;

            handler.post(runMethod);

            if (oneTime)
            {
                enabled = false;
                return;
            }

            handler.postDelayed(timer_tick, intervalMs);
        }
    }; 
}

3

আমি একটি হ্যান্ডলার ব্যবহার করছি এবং একটি টাইমার তৈরি করতে চালাতে সক্ষম। আমি এটি একটি বিমূর্ত ক্লাসে আবৃত করি। এটি কেবল প্রকাশ / প্রয়োগ করুন এবং আপনি যেতে ভাল:

 public static abstract class SimpleTimer {
    abstract void onTimer();

    private Runnable runnableCode = null;
    private Handler handler = new Handler();

    void startDelayed(final int intervalMS, int delayMS) {
        runnableCode = new Runnable() {
            @Override
            public void run() {
                handler.postDelayed(runnableCode, intervalMS);
                onTimer();
            }
        };
        handler.postDelayed(runnableCode, delayMS);
    }

    void start(final int intervalMS) {
        startDelayed(intervalMS, 0);
    }

    void stop() {
        handler.removeCallbacks(runnableCode);
    }
}

নোট করুন যে handler.postDelayedকোডটি কার্যকর করার আগে বলা হয়েছিল - এটি টাইমারটিকে "প্রত্যাশিত" হিসাবে আরও বন্ধ করার সময়সীমা তৈরি করবে। তবে ক্ষেত্রে ক্ষেত্রে টাইমারটি প্রায়শই চলতে থাকে এবং টাস্কটি onTimer()দীর্ঘ হয় - ওভারল্যাপ থাকতে পারে ps intervalMSকাজটি শেষ হওয়ার পরে যদি আপনি গণনা শুরু করতে চান তবে onTimer()কলকে উপরে একটি লাইন সরান ।


2

আমি বিশ্বাস করি অ্যান্ড্রয়েডে এটি করার উপায়টি হ'ল চলমান অবস্থায় আপনার পটভূমি পরিষেবা প্রয়োজন। সেই ব্যাকগ্রাউন্ড অ্যাপ্লিকেশনটিতে টাইমার তৈরি করুন। যখন টাইমার "টিক্স" (আপনি কতক্ষণ অপেক্ষা করতে চান তার জন্য অন্তর সেট করুন), আপনি যে কার্যকলাপ শুরু করতে চান তা চালু করুন।

http://developer.android.com/guide/topics/fundamentals.html (<- এই নিবন্ধটি ক্রিয়াকলাপ, পরিষেবা, উদ্দেশ্য এবং অ্যান্ড্রয়েড বিকাশের অন্যান্য মূল ফান্ডামেন্টালগুলির মধ্যে সম্পর্ক ব্যাখ্যা করে)


1

আমি ( Timer, TimerTask) পাশাপাশি Handlerসময়োপযোগী (সময় গ্রহণকারী) কাজগুলি ব্যবহার করতে ব্যবহার করতাম । এখন আমি পুরোটা আরএক্স জাভাতে স্যুইচ করেছি। আরএক্সজাভা প্রদান করে Observable.timerযা সহজ, ত্রুটি-প্রবণ কম, ঝামেলা-মুক্ত।

public class BetterTimerFragment extends Fragment {
  public static final String TAG = "BetterTimer";
  private TextView timeView;
  private Subscription timerSubscription;

  @Override
  public View onCreateView(LayoutInflater inflater,
                           @Nullable ViewGroup container,
                           @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_timer, container, false);
  }

  @Override
  public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    timeView = (TextView) view.findViewById(R.id.timeView);
  }

  @Override
  public void onResume() {
    super.onResume();

    // Right after the app is visible to users, delay 2 seconds
    // then kick off a (heavy) task every 10 seconds.
    timerSubscription = Observable.timer(2, 10, TimeUnit.SECONDS)
        .map(new Func1<Long, String>() {
          @Override
          public String call(Long unused) {
            // TODO: Probably do time-consuming work here.
            // This runs on a different thread than the main thread.
            return "Time: " + System.currentTimeMillis();
          }
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<String>() {
          @Override
          public void call(String timeText) {
            // The result will then be propagated back to the main thread.
            timeView.setText(timeText);
          }
        }, new Action1<Throwable>() {
          @Override
          public void call(Throwable throwable) {
            Log.e(TAG, throwable.getMessage(), throwable);
          }
        });
  }

  @Override
  public void onPause() {
    super.onPause();

    // Don't kick off tasks when the app gets invisible.
    timerSubscription.unsubscribe();
  }
}

1

টাইমিং অপারেশনের জন্য আপনার হ্যান্ডলার ব্যবহার করা উচিত ।

আপনার যদি কোনও ব্যাকগ্রাউন্ড পরিষেবা চালানোর দরকার হয় তবে অ্যালার্ম ম্যানেজারটি হ'ল উপায়।


0

এই উদাহরণটি কোটলিনে ধ্বংস হওয়া টাইমার ইউনিটটি শুরু করুন

private lateinit var timerTask: TimerTask

 timerTask = object : TimerTask() {
        override fun run() {
            Log.d("KTZ", "$minutes:$seconds");
            timeRecordingLiveData.postValue("$minutes:$seconds")
            seconds += 1;
            if (seconds == 60) {
                Log.d("KTZ", "$minutes:$seconds");
                timeRecordingLiveData.postValue("$minutes:$seconds")
                seconds = 0;
                minutes += 1;
            }
        }

    }

অনডেট্রয়ে টাইমটাস্ক বাতিল করুন ()

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