কেউ কি প্রতি সেকেন্ড বা তার পরে টেক্সটফিল্ড আপডেট করার সহজ উদাহরণ দিতে পারে?
আমি একটি উড়ন্ত বল তৈরি করতে চাই এবং প্রতি সেকেন্ডে বল স্থানাঙ্কগুলি গণনা / আপডেট করতে হবে, এজন্যই আমাকে কিছু টাইমার প্রয়োজন।
আমি এখান থেকে কিছু পাই না ।
কেউ কি প্রতি সেকেন্ড বা তার পরে টেক্সটফিল্ড আপডেট করার সহজ উদাহরণ দিতে পারে?
আমি একটি উড়ন্ত বল তৈরি করতে চাই এবং প্রতি সেকেন্ডে বল স্থানাঙ্কগুলি গণনা / আপডেট করতে হবে, এজন্যই আমাকে কিছু টাইমার প্রয়োজন।
আমি এখান থেকে কিছু পাই না ।
উত্তর:
ঠিক আছে যেহেতু এটি পরিষ্কার করা হয়নি এখনও এটি পরিচালনা করার জন্য 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");
}
}
এটা সহজ! আপনি নতুন টাইমার তৈরি করুন।
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);
দাবি অস্বীকার: এটি আদর্শ সমাধান নয়। এটি টাইমার ক্লাস ব্যবহার করে সমাধান (যেমন ওপি দ্বারা জিজ্ঞাসা করা হয়েছে)। অ্যান্ড্রয়েড এসডিকে, হ্যান্ডলার ক্লাসটি ব্যবহার করার প্রস্তাব দেওয়া হয় (স্বীকৃত উত্তরের উদাহরণ রয়েছে)।
আপনার যদি নিজের কোডটি ইউআই থ্রেডে চালানোর প্রয়োজন হয় (এবং টাইমার থ্রেডে নয়) তবে ব্লগটি একবার দেখুন: 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
}
};
}
যদি কেউ কেবল পথেই অন্তরগুলিতে নিয়মিত বিজ্ঞপ্তিগুলি সহ ভবিষ্যতে কোনও সময় পর্যন্ত একটি গণনা নির্ধারণ করতে চায় তবে আপনি API স্তর 1 থেকে পাওয়া কাউন্টডাউনটাইমার শ্রেণিটি ব্যবহার করতে পারেন ।
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
editText.setText("Seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
editText.setText("Done");
}
}.start();
SS:MiMi
? ধন্যবাদ
এটি একটি টাইমার জন্য কিছু সহজ কোড:
Timer timer = new Timer();
TimerTask t = new TimerTask() {
@Override
public void run() {
System.out.println("1");
}
};
timer.scheduleAtFixedRate(t,1000,1000);
আমি মনে করি আপনি এটি আরএক্স উপায়ে করতে পারেন:
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
কারণ এই প্রশ্নটি এখনও গুগল অনুসন্ধান থেকে অনেকগুলি ব্যবহারকারীকে আকর্ষণ করছে (অ্যান্ড্রয়েড টাইমার সম্পর্কে) আমি আমার দুটি কয়েন সন্নিবেশ করতে চাই।
সবার আগে, টাইমার শ্রেণি জাভা 9 এ অবচয় করা হবে (গৃহীত উত্তরটি পড়ুন) ।
সরকারী প্রস্তাব উপায় ব্যবহার করা ScheduledThreadPoolExecutor যা বেশি কার্যকর এবং বৈশিষ্ট্য সমৃদ্ধ যে অতিরিক্ত একটি প্রদত্ত বিলম্বের পর চালানোর সময়সূচি কমান্ড করতে পারেন, অথবা কিছু সময় অন্তর চালানো। এছাড়াও, এটি থ্রেডপুলএক্সেকিউটারের অতিরিক্ত নমনীয়তা এবং ক্ষমতা দেয়।
এখানে সরল কার্যকারিতা ব্যবহারের একটি উদাহরণ।
নির্বাহক পরিষেবা তৈরি করুন:
final ScheduledExecutorService SCHEDULER = Executors.newScheduledThreadPool(1);
আপনি চালানোর যোগ্য শিডিউল:
final Future<?> future = SCHEDULER.schedule(Runnable task, long delay,TimeUnit unit);
আপনি এখন 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.
}
আমি অবাক হয়েছি যে আরএক্সজেভা 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())
তা টাইমার সমাপ্তির পরে চালানো কোডটি মূল থ্রেডে সম্পন্ন হবে তা নিশ্চিত করে।
অযাচিত মেমোরি ফাঁস এড়াতে, ক্রিয়াকলাপ / খণ্ডটি নষ্ট হয়ে গেলে আপনার সদস্যতা ত্যাগ করা নিশ্চিত করা উচিত।
Subscription
মাধ্যমে .subscribe()
পদ্ধতিতে ফিরে আসা কেবল সংরক্ষণ করুন এবং subscription.unsubscribe()
আপনি টাইমারটি থামাতে চাইলে কল করুন।
তিনি হ'ল সহজ সমাধান, আমার অ্যাপ্লিকেশনটিতে কাজ করে।
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;
}
}
}
আপনি চান আপনার ইউআই আপডেটগুলি ইতিমধ্যে বিদ্যমান ইউআই থ্রেডে ঘটুক।
সর্বোত্তম উপায় হ্যান্ডলার ব্যবহার করা যা দেরী হওয়ার পরে রান্নেবল চালানোর জন্য পোস্টডলেড ব্যবহার করে (প্রতিটি রান পরবর্তী সময়সূচী); অপসারণ কলব্যাক্স দিয়ে কলব্যাক সাফ করুন।
আপনি ইতিমধ্যে সঠিক জায়গায় সন্ধান করছেন, সুতরাং এটি আবার দেখুন, সম্ভবত সেই কোড নমুনাটি আপনি চান না কেন তা পরিষ্কার করুন। ( একটি টাইমার থেকে ইউআই আপডেট করার সময়ও অভিন্ন প্রবন্ধটি দেখুন )।
এখানে একটি সহজ নির্ভরযোগ্য উপায় ...
আপনার ক্রিয়াকলাপে নিম্নলিখিত কোডটি রাখুন এবং আপনার ক্রিয়াকলাপটি "পুনরায় চালু" অবস্থায় থাকা অবস্থায় টিক () পদ্ধতিটি প্রতি সেকেন্ডে ইউআই থ্রেডে কল করা হবে। অবশ্যই, আপনি যা চান তা করতে টিক () পদ্ধতিটি পরিবর্তন করতে পারেন, বা আরও বা কম ঘন ঘন ডাকা হতে পারেন।
@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 = _ হ্যান্ডলার" কোডটি প্রয়োজনীয়।
_h0
পরিবর্তে পদ্ধতির removeCallbacks
মধ্যে onPause
বাকিদের মত?
আপনি এটির জন্য অ্যানিমেটারও ব্যবহার করতে পারেন:
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();
আপডেট লুপটি পরিচালনা করতে আপনাকে একটি থ্রেড তৈরি করতে হবে এবং এটি টেক্সারিয়া আপডেট করতে ব্যবহার করতে হবে। যদিও জটিল অংশটি হ'ল কেবলমাত্র মূল থ্রেডটি আসলে ইউআইকে সংশোধন করতে পারে তাই আপডেট লুপ থ্রেডটি আপডেট করার জন্য মূল থ্রেডকে সিগন্যাল করা প্রয়োজন। এটি একটি হ্যান্ডলার ব্যবহার করে করা হয়।
এই লিঙ্কটি দেখুন: http://developer.android.com/guide/topics/ui/dialogs.html# "দ্বিতীয় থ্রেড সহ উদাহরণস্বরূপ অগ্রগতি ডায়ালগ" শীর্ষক বিভাগটি ক্লিক করুন। এটি একটি পাঠ্যক্ষেত্রের পরিবর্তে অগ্রগতি কথোপকথন ছাড়া আপনার ঠিক কী করা দরকার তার একটি উদাহরণ।
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 ");
}
যদি কেউ আগ্রহী হন, আমি কোনও ক্রিয়াকলাপের ইউআই থ্রেডে চালানোর জন্য একটি স্ট্যান্ডার্ড অবজেক্ট তৈরি করে চারপাশে খেলা শুরু করেছি। ঠিক আছে কাজ মনে হচ্ছে। মন্তব্য স্বাগত। কোনও ক্রিয়াকলাপের দিকে টেনে আনার জন্য উপাদান হিসাবে লেআউট ডিজাইনারে এটি উপলব্ধ থাকতে আমি পছন্দ করি। এরকম কিছু ইতিমধ্যে বিদ্যমান নেই বিশ্বাস করতে পারে না।
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();
}
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"/>
আপনার যদি ইতিমধ্যে ডেল্টা সময় থাকে।
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();
}
}
}
আমি টাইমার অ্যাবস্ট্রাক্ট করে এটিকে একটি পৃথক শ্রেণিতে পরিণত করেছি:
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++;
}
});
}
...
}
আমি আশা করি এটি সাহায্য করে 😊👌
আমি এইভাবে ব্যবহার করি:
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();
এই সমস্যাটি সমাধানের এটি সহজ উপায়।
যারা ক্রোনোমিটারের উপর নির্ভর করতে পারেন না তাদের জন্য আমি পরামর্শগুলির একটির মধ্যে একটি ইউটিলিটি ক্লাস করেছি:
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();